最近研究了一番如何通过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 旗标实现

    Linux 内核提供了一个遵守上面语义的旗标实现, 尽管术语有些不同. 为使用旗标, 内核 代码必须包含 <asm/semaphore.h>. 相关的类型是 struct semaphor ...

  2. Jmeter 发送json

    阅读更多 使用jmeter发送json数据.方法有三种 原创,转载请注明出处 1.利用CSV Data set Config. 参考: http://demi-panda.com/2013/01/08 ...

  3. 基于ElementUI封装Excel数据导入组件

    由于前端项目使用的是Vue-cli3.0 + TypeScript的架构,所以该组件也是基于ts语法封装的,组件的完整代码如下: <template> <div id="m ...

  4. Mockito -- 入门篇

    Mockito是一种mock工具/框架.我理解EasyMock有点过时了,Mockito是现在比较流行的. 什么是mock?说的直白一点,大家都知道unit test应该是尽可能独立的.对一个clas ...

  5. 2018-5-19-创建不带BOM-的UTF8

    title author date CreateTime categories 创建不带BOM 的UTF8 lindexi 2018-05-19 14:11:33 +0800 2018-2-13 17 ...

  6. html 中文占位符

    => 普通的英文半角空格   =>   =>   => no-break space (普通的英文半角空格但不换行)   => 中文全角空格 (一个中文宽度)   =&g ...

  7. Python3_函数参数传递、可变与不可变对象、变量作用域、函数返回值

    参数传递: 在 python 中,类型属于对象,变量是没有类型的:(变量都仅仅是一个对象的引用,没有类型之分)a=[1,2,3] a="Runoob" 以上代码中,[1,2,3] ...

  8. CentOS 下 maven 安装

    获取maven安装包 wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bi ...

  9. centos安装pip,zipimport.ZipImportError报错

    安装pip下载pip安装包wget https://bootstrap.pypa.io/get-pip.py 执行以下报错 python get-pip.py ##报错内容(zipimport.Zip ...

  10. 【学习】调用iframe中的方法

    当页面中有iframe时,想在主页面调用iframe中的方法,可以用contentWindow属性.但具体用时还有一点要注意,就是必须等页面加载完成才可以,否则会报错找不到函数. 例: 父页面: &l ...