Heroku学习 - 利用Heroku app实现 OrgA 查询Org B 的数据数据
最近研究了一番如何通过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-
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 || , 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 || ).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,查看结果。
到这里其实有个问题,就是安全性问题,需要测试,后续再更新。
Heroku学习 - 利用Heroku app实现 OrgA 查询Org B 的数据数据的更多相关文章
- 手把手教你如何利用 HeroKu 免费获取一个 Scrapyd 集群
手把手教你如何利用 HeroKu 免费获取一个 Scrapyd 集群 本文原始地址:https://sitoi.cn/posts/48724.html 准备环境 一个 GitHub 的账号 一个 He ...
- CASE函数 sql server——分组查询(方法和思想) ref和out 一般处理程序结合反射技术统一执行客户端请求 遍历查询结果集,update数据 HBuilder设置APP状态栏
CASE函数 作用: 可以将查询结果集的某一列的字段值进行替换 它可以生成一个新列 相当于switch...case和 if..else 使用语法: case 表达式/字段 when 值 then ...
- Android学习系列(15)--App列表之游标ListView(索引ListView)
游标ListView,提供索引标签,使用户能够快速定位列表项. 也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧. 一看图啥都懂了: 1. ...
- Android学习系列(10)--App列表之拖拽ListView(上)
研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨. 鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章. ...
- Android学习系列(37)--App调试内存泄露之Context篇(下)
接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...
- 学习笔记:APP切图那点事儿–详细介绍android和ios平台
学习笔记:APP切图那点事儿–详细介绍android和ios平台 转载自:http://www.woofeng.cn/articles/168.html 版权归原作者所有 作者:亚茹有李 原文地址 ...
- Android学习系列(7)--App轮询服务器消息
这篇文章是android开发人员的必备知识. 1.轮询服务器 一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务. 其中需要注意轮询的频率 ...
- Android学习系列(23)--App主界面实现
在上篇文章<Android学习系列(22)--App主界面比较>中我们浅略的分析了几个主界面布局,选了一个最大众化的经典布局.今天我们就这个经典布局,用代码具体的实现它. 1.预览图先看下 ...
- Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识
Python 数据分析(二) 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识 第1节 groupby 技术 第2节 数据聚合 第3节 分组级运算和转换 第4 ...
随机推荐
- H3C调试信息输出的例子
- linux 使用 ioctl 参数
在看 scull 驱动的 ioctl 代码之前, 我们需要涉及的另一点是如何使用这个额外的参数. 如果它是一个整数, 就容易: 它可以直接使用. 如果它是一个指针, 但是, 必须小心些. 当用一个指针 ...
- linux Tasklets 机制
tasklet 类似内核定时器在某些方面. 它们一直在中断时间运行, 它们一直运行在调度它 们的同一个 CPU 上, 并且它们接收一个 unsigned long 参数. 不象内核定时器, 但是, 你 ...
- C# 如何引用 WshShell 类
如果想要创建快捷方式等,很多使用都需要引用 WshShell 类,这个类需要通过 COM 的方法引用 引用 WshShell 不是在一个程序集,而是 Windows Script Host Objec ...
- Loj2604开车旅行
Loj2604开车旅行 我完全没有看出这道题哪里是DP 首先,一个位置向后的最近和第二近我们可以通过set去简单实现 通过维护最大和次大即可 至于高度相同的情况我们可以通过先在set中查询小的来实现 ...
- eclipse快捷键记录
转自:http://blog.csdn.net/siphiababy/article/details/74179684 ctrl+2+L这个快捷键可自动补全代码,极大提升编码效率! 注:ctrl和2同 ...
- vue依赖
ajax:vue-resource moke数据:body-parser
- Python3_函数参数传递、可变与不可变对象、变量作用域、函数返回值
参数传递: 在 python 中,类型属于对象,变量是没有类型的:(变量都仅仅是一个对象的引用,没有类型之分)a=[1,2,3] a="Runoob" 以上代码中,[1,2,3] ...
- ASP.NET MVC API以及.Core API进行安全拦截和API请求频率控制
安全拦截思路: 根据IP以及请求次数,该IP超过规定请求次数,就有很大可能是非正常用户进行的请求(比如WEB攻击),这时候进行拦截,拦截成功会提示:The allowed number of requ ...
- vue学习笔记(四)事件处理器
前言 在上一章vue学习笔记(三)class和style绑定的内容中,我们学习了如何在vue中绑定class和style,介绍了常用的绑定方法,class的数组绑定和对象绑定以及style的数组绑定和 ...