最近研究了一番如何通过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 的数据数据的更多相关文章

  1. 手把手教你如何利用 HeroKu 免费获取一个 Scrapyd 集群

    手把手教你如何利用 HeroKu 免费获取一个 Scrapyd 集群 本文原始地址:https://sitoi.cn/posts/48724.html 准备环境 一个 GitHub 的账号 一个 He ...

  2. CASE函数 sql server——分组查询(方法和思想) ref和out 一般处理程序结合反射技术统一执行客户端请求 遍历查询结果集,update数据 HBuilder设置APP状态栏

    CASE函数   作用: 可以将查询结果集的某一列的字段值进行替换 它可以生成一个新列 相当于switch...case和 if..else 使用语法: case 表达式/字段 when 值 then ...

  3. Android学习系列(15)--App列表之游标ListView(索引ListView)

    游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1. ...

  4. Android学习系列(10)--App列表之拖拽ListView(上)

     研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨.      鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章. ...

  5. Android学习系列(37)--App调试内存泄露之Context篇(下)

    接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...

  6. 学习笔记:APP切图那点事儿–详细介绍android和ios平台

    学习笔记:APP切图那点事儿–详细介绍android和ios平台 转载自:http://www.woofeng.cn/articles/168.html   版权归原作者所有 作者:亚茹有李 原文地址 ...

  7. Android学习系列(7)--App轮询服务器消息

    这篇文章是android开发人员的必备知识. 1.轮询服务器     一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务.    其中需要注意轮询的频率 ...

  8. Android学习系列(23)--App主界面实现

    在上篇文章<Android学习系列(22)--App主界面比较>中我们浅略的分析了几个主界面布局,选了一个最大众化的经典布局.今天我们就这个经典布局,用代码具体的实现它. 1.预览图先看下 ...

  9. Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识

    Python 数据分析(二) 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识 第1节 groupby 技术 第2节 数据聚合 第3节 分组级运算和转换 第4 ...

随机推荐

  1. linux内核符号表

    我们已经看到 insmod 如何对应共用的内核符号来解决未定义的符号. 表中包含了全局内 核项的地址 -- 函数和变量 -- 需要来完成模块化的驱动. 当加载一个模块, 如何由模块 输出的符号成为内核 ...

  2. linux获知当前时间

    内核代码能一直获取一个当前时间的表示, 通过查看 jifies 的值. 常常地, 这个值只代 表从最后一次启动以来的时间, 这个事实对驱动来说无关, 因为它的生命周期受限于系统 的 uptime. 如 ...

  3. vue-learning:3-template-{{}}-and-v-html

    插值{{ }} 和 v-html 本节开始,我们按如下顺序学习vue模板API-指令.点击各部分的DEMO可在线查看代码 输出字符串文本内容的插值:{{}} 输出HMTL元素作为内容的指令:v-htm ...

  4. 写时拷贝COW(copy-on-write)

        写时拷贝技术是通过"引用计数"实现的,在分配空间的时候多分配4个字节,用来记录有多少个指针指向块空间,当有新的指针指向这块空间时,引用计数加一,当要释放这块空间时,引用计数 ...

  5. Delphi XE里的StrPas要注意哦(要让StrPas知道哪里是字符串结束)

    废话不多说了,直接上例子解说: procedure TForm1.Button1Click(Sender: TObject);var  aa: array[0..1]of AnsiChar;  bb1 ...

  6. leetcode.769旋转字符串

    给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转操作之后,A 能变成B ...

  7. 使用宝塔搭建nextcloud的过程(搭建、优化、问题)

    宝塔部署教程 参考网址: 使用NextCloud来搭建我们的私有网盘.并结合Redis优化性能(宝塔) https://www.moerats.com/archives/175/ 宝塔面板下nextc ...

  8. Jmeter-Ant 生成测试报告配置步骤

    1.配置java环境变量(不会的可以自行百度) 2.安装jmeter 3.安装ant,配置ant环境变量 4.将JMeter所在目录下extras子目录里的ant-JMeter-1.1.1.jar复制 ...

  9. 图解Go语言的context了解编程语言核心实现源码

    基础筑基 基于线程的编程语言中的一些设计 ThreadGroup ThreadGroup是基于线程并发的编程语言中常用的一个概念,当一个线程派生出一个子线程后通常会加入父线程的线程组(未指定线程组的情 ...

  10. 洛谷P1385 密令 题解 动态规划

    题目链接:https://www.luogu.com.cn/problem/P1385 题目大意: 给定一小写字母串s,每次操作你可以选择一个p(1<=p<|s|)执行下述修改中的任意一个 ...