最近研究了一番如何通过Heroku应用对OrgA开放一个接口,参数传递的是一个SQL,APP的负责将SQL通过callout的形式调用目标OrgB Rest API来获取数据并返回给OrgA。我是用的是nforce,express实现的,还有一种方式可以用jsforce,但我这条路没有走通,卡在总是提示我以下错误,问题是jsforce依赖包中hardcode的路径,而实际上core-js依赖包中并不存在,导致不兼容,我暂时无法解决,如果有方法,请不吝赐教。
Error: Cannot find module 'core-js/modules/es6.array.for-each'
2020-01-07T03:23:04.257723+00:00 app[web.1]: Require stack:
2020-01-07T03:23:04.257725+00:00 app[web.1]: - /app/node_modules/jsforce/lib/index.js
2020-01-07T03:23:04.257727+00:00 app[web.1]: - /app/node_modules/jsforce/index.js
2020-01-07T03:23:04.257729+00:00 app[web.1]: - /app/server.js
0. 此时先在Salesforce中创建一个Connected App, 并记录下ClientID和ClientSecret值,不加赘述。
接下来首先需要先安装Heroku CLI 和 Git。
1. 可以选择安装Githug Desk 并选项安装工具Windows PowerShell GitHub Desktop website 或者
安装Git Bash https://devcenter.heroku.com/articles/git
https://git-scm.com/download/win。打开控制台
2. 安装Heroku CLI
npm install -g heroku
3. 创建新项目
ng new [新项目名]
4. 进入新项目
cd [新项目]
5. 登录Heroku
heroku login
6. 输入Heroku用户名和密码登录成功。
7. 创建Heroku App, 系统会为app随机生成一个标识。
heroku create
Creating app... done, ⬢ tranquil-shore-75468 https://tranquil-shore-75468.herokuapp.com/ | https://git.heroku.com/tranquil-shore-75468.git
8. 创建server.js
touch server.js
9. 修改server.js
var express = require('express'); var bodyParser = require('body-parser'); var nforce = require('nforce'); var app = express(); app.use(express.static(__dirname + "/public")); app.use(bodyParser.json());
app.use(express.json()); // to support JSON-encoded bodies
app.use(express.urlencoded()); // to support URL-encoded bodies
//nforce setup to connect Salesforce var org = nforce.createConnection({ clientId: '[Client Key of Connected APP]', clientSecret: '[Client Secret of Connected APP]', redirectUri: 'https://localhost:3030/oauth/_callback', //apiVersion: 'v37.0', // optional, defaults to current salesforce API version environment: 'production', // optional, salesforce 'sandbox' or 'production', production default mode: 'single' // optional, 'single' or 'multi' user mode, multi default }); // Initialize the app. var server = app.listen(process.env.PORT || 8080, function () { var port = server.address().port; console.log("App now running on port", port); }); // LEAD API ROUTES BELOW // Generic error handler used by all endpoints. function handleError(res, reason, message, code) { console.log("ERROR: " + reason); res.status(code || 500).json({"error": message}); } //, securityToken is required if IP Range is not set in profile app.get("/queryList", function(req, res) { org.authenticate({ username: '*********', password:'**********',grant_type:'password'}, function(err, oauth){ if(err) { console.log('Error: ' + err.message); } else {
var sqlStr = req.body.sql;// use req.body 获取参数 console.log('Access Token: ' + oauth.access_token); org.query({query:"select id from lead"}, function (err, resp) { if(err) throw err; if(resp.records && resp.records.length){ res.send(resp.records); } }); } }); }); app.listen(app.get('port'), function () { console.log('Express server listening on port ' + app.get('port')); });
注意到这个文件头有以下几个引用包,所以不难理解我们接下来需要安装其对应的包。
var express = require('express'); var bodyParser = require('body-parser'); var nforce = require('nforce');
10. 安装依赖包, --save可以将依赖包自动保存在package.json文件中。
npm install express body-parser nforce –-save
11.Git部署
git init heroku git:remote -a [App表示名] git add . git commit -m '[添加注释文字]' git push heroku master
12. 测试
在Postman中测试模拟调用[appname].herokuapp.com/queryListWithAllConditions,查看结果。
到这里其实有个问题,就是安全性问题,需要测试,后续再更新。