Edited at

Node.jsからSalesforce REST APIを実行する (カスタムオブジェクトへレコードを追加する)

More than 1 year has passed since last update.


はじめに

Salesforceに対して、様々な操作を行えるSalesforce REST APIというものがあります。

Salesforce REST APIを使用する事で、Node.jsからSalesforceにレコードを追加したり、レコードを取得したりといった操作が可能です。

Node.jsからSalesforce REST APIを実行する事で、SalesforceのForce.comカスタムオブジェクトにレコードを追加するサンプルプログラムを記します。

また、Force.comカスタムオブジェクトに登録したレコード一覧を表示するサンプルプログラムも合わせて記します。


環境

Node.jsからSalesforce REST APIを呼び出す環境については、以下の手順を参考にして、AWS EC2インスタンス(Amazon Linux)で作成しました。また、EC2インスタンスからSalesforce REST APIを呼び出す為のSalesforce OAuth設定も以下をご参照下さい。

http://qiita.com/na0AaooQ/items/157c28a80948c4b97bed

Node.jsからSalesforce REST APIの呼び出しについては、JSforceを使用させて頂きました。ありがとうございました。

https://jsforce.github.io/

https://github.com/jsforce/jsforce


EC2インスタンス(Amazon Linux)へのNode.jsとJSforceインストール

(1) EC2インスタンス(Amazon Linux)にNode.jsをインストールします。

[ec2-user@example-salesforce-api-test-nodejs ~]$ uname -a

Linux example-salesforce-api-test-nodejs 4.4.19-29.55.amzn1.x86_64 #1 SMP Mon Aug 29 23:29:40 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

[ec2-user@example-salesforce-api-test-nodejs ~]$ sudo yum install nodejs npm --enablerepo=epel

[ec2-user@example-salesforce-api-test-nodejs ~]$ npm --version
1.3.6
[ec2-user@example-salesforce-api-test-nodejs ~]$ node --version
v0.10.46
[ec2-user@example-salesforce-api-test-nodejs ~]$

(2) npmによりJSforceをインストールします。

今回の例では、レコード追加とレコード表示プログラムを各ディレクトリに作成していく事にします。

プログラム内容
作成するディレクトリ名

カスタムオブジェクトにレコードを追加するプログラム
/home/ec2-user/insert_salesforce_api_test

カスタムオブジェクトのレコードを表示するプログラム
/home/ec2-user/select_salesforce_api_test

カスタムオブジェクトへのレコード追加プログラムを保存するディレクトリを作成します。

[ec2-user@example-salesforce-api-test-nodejs ~]$ mkdir /home/ec2-user/insert_salesforce_api_test

[ec2-user@salesforce-api-test-nodejs ~]$

[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$ pwd
/home/ec2-user/insert_salesforce_api_test

[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$ npm install jsforce

[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$ npm install date-utils

[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$

カスタムオブジェクトのレコード表示プログラムを保存するディレクトリを作成します。

[ec2-user@example-salesforce-api-test-nodejs ~]$ mkdir /home/ec2-user/select_salesforce_api_test

[ec2-user@example-salesforce-api-test-nodejs ~]$

[ec2-user@example-salesforce-api-test-nodejs select_salesforce_api_test]$ pwd
/home/ec2-user/select_salesforce_api_test

[ec2-user@example-salesforce-api-test-nodejs select_salesforce_api_test]$ npm install jsforce

[ec2-user@example-salesforce-api-test-nodejs select_salesforce_api_test]$ npm install date-utils

[ec2-user@example-salesforce-api-test-nodejs select_salesforce_api_test]$


Node.jsからSalesforce REST APIを実行してカスタムオブジェクトにレコードを追加する

Node.jsからSalesforce REST APIを呼び出し、カスタムオブジェクトにレコードを追加します。

Force.comカスタムオブジェク「テストオブジェクト」(例としてオブジェクト名が QuickStart__c であるとします)にレコードを追加するNode.jsプログラムを作成します。

これを実行すると、カスタムオブジェクトにレコードを追加出来ます。

[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$ pwd

/home/ec2-user/insert_salesforce_api_test
[ec2-user@salesforce-api-test-nodejs insert_salesforce_api_test]$ vi /home/ec2-user/insert_salesforce_api_test/index.js


/home/ec2-user/insert_salesforce_api_test/index.js

[ec2-user@salesforce-api-test-nodejs insert_salesforce_api_test]$ cat /home/ec2-user/insert_salesforce_api_test/index.js

require('date-utils');
var jsforce = require('jsforce');

// Salesforce REST APIエンドポイント
//// Sandbox環境へ接続する場合のAPIエンドポイント
//var oauth_login_url = 'https://test.salesforce.com';
//// 本番環境へ接続する場合のAPIエンドポイント
var oauth_login_url = 'https://login.salesforce.com';

// Salesforce REST APIで接続するアプリケーションの「コンシューマ鍵」を設定する
var oauth_client_id = '3MV*******************************************************************************THF';

// Salesforce REST API接続用のSalesforceユーザ名を設定する
var oauth_client_username = 'example_salesforce_api_user@hoge.example.com';

// Salesforce REST APIで接続するアプリケーションの「コンシューマの秘密」を設定する
var oauth_client_secret = '19***************84';

// Salesforce REST API接続用のSalesforceユーザのパスワードを設定する
var oauth_client_authenticate_password = '*************';

var sobject_name = 'QuickStart__c';

// Salesforce REST APIへ接続する時の「コンシューマ鍵」(OAuthコンシューマキー等)をセットする
var conn = new jsforce.Connection({
oauth2 : {
loginUrl : oauth_login_url,
clientId : oauth_client_id,
clientSecret : oauth_client_secret
}
});

// カスタムオブジェクトへ追加するデータをセット
var date = new Date();
var insert_time = date.toFormat("YYYYMMDD_HH24MISS");
var insert_name = "testname_Node_" + insert_time;
var insert_email = insert_name + "@hoge.example.com";
var create_date = date.toFormat("YYYY-MM-DD");

var insert_record = {
user_name__c: insert_name,
user_email__c: insert_email,
create_date__c: create_date
};

console.log("Salesforce REST API Insert Record");
console.log(insert_record);

// Salesforce REST APIへ接続する
conn.login( oauth_client_username, oauth_client_authenticate_password, function(err, res) {
if (err) { return console.error(err); }

// SalesForce REST APIを実行してカスタムオブジェクトへレコードを追加する
conn.sobject( sobject_name ).create( insert_record, function(err, res) {
if (err) { return console.error(err); }
console.log(res);
});
});


Node.jsプログラムを実行すると、Force.comカスタムオブジェクトにレコードを追加出来ます。

[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$ pwd

/home/ec2-user/insert_salesforce_api_test

[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$ node /home/ec2-user/insert_salesforce_api_test/index.js
SalesForce REST API Insert Record
{ user_name__c: 'testname_Node_20160912_020629',
user_email__c: 'testname_Node_20160912_020629@hoge.example.com',
create_date__c: '2016-09-12' }
{ id: 'a032800000GB179AAD', success: true, errors: [] }
[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$


Node.jsからSalesforce REST APIを実行してカスタムオブジェクトのレコードを表示する

Node.jsからSalesforce REST APIを呼び出し、カスタムオブジェクトのレコードを表示します。

Force.comカスタムオブジェク「テストオブジェクト」(例としてオブジェクト名が QuickStart__c であるとします)に登録されているレコードを表示するNode.jsプログラムを作成します。

これを実行すると、カスタムオブジェクトのレコードを表示出来ます。

[ec2-user@example-salesforce-api-test-nodejs select_salesforce_api_test]$ pwd

/home/ec2-user/select_salesforce_api_test
[ec2-user@example-salesforce-api-test-nodejs select_salesforce_api_test]$ vi /home/ec2-user/select_salesforce_api_test/index.js


/home/ec2-user/select_salesforce_api_test/index.js

var jsforce = require('jsforce');

// Salesforce REST APIエンドポイント
//// Sandbox環境へ接続する場合のAPIエンドポイント
//var oauth_login_url = 'https://test.salesforce.com';
//// 本番環境へ接続する場合のAPIエンドポイント
var oauth_login_url = 'https://login.salesforce.com';

// Salesforce REST APIで接続するアプリケーションの「コンシューマ鍵」を設定する
var oauth_client_id = '3MV*******************************************************************************THF';

// Salesforce REST API接続用のSalesforceユーザ名を設定する
var oauth_client_username = 'example_salesforce_api_user@hoge.example.com';

// Salesforce REST APIで接続するアプリケーションの「コンシューマの秘密」を設定する
var oauth_client_secret = '19***************84';

// Salesforce REST API接続用のSalesforceユーザのパスワードを設定する
var oauth_client_authenticate_password = '*************';

// Salesforce カスタムオブジェクトに対して実行するSOQLを設定する
var sobject_name = 'QuickStart__c';
var soql = 'SELECT user_name__c, user_email__c, create_date__c FROM ' + sobject_name;

// Salesforce REST APIへ接続する時の「コンシューマ鍵」(OAuthコンシューマキー等)をセットする
var conn = new jsforce.Connection({
oauth2 : {
loginUrl : oauth_login_url,
clientId : oauth_client_id,
clientSecret : oauth_client_secret
}
});

console.log("Salesforce REST API Test SELECT SOQL [" + soql + "]");

// Salesforce REST APIへ接続する
conn.login( oauth_client_username, oauth_client_authenticate_password, function(err, res) {
if (err) { return console.error(err); }

// Salesforce REST APIを実行してカスタムオブジェクトへレコードを追加する
conn.query( soql, function(err, res) {
if (err) { return console.error(err); }
console.log(res);
});
});


Node.jsプログラムを実行すると、Force.comカスタムオブジェクトに登録されているレコードを表示出来ます。

[ec2-user@example-salesforce-api-test-nodejs select_salesforce_api_test]$ node /home/ec2-user/select_salesforce_api_test/index.js

SalesForce REST API Test SELECT SOQL [SELECT user_name__c, user_email__c, create_date__c FROM QuickStart__c]
{ totalSize: 29,
done: true,
records:
[ { attributes: [Object],
user_name__c: 'テスト太郎',
user_email__c: 'test.tarou@example.com',
create_date__c: null },
{ attributes: [Object],
user_name__c: 'テスト次郎',
user_email__c: 'test.jirou@example.com',
create_date__c: null },

 (中略)

{ attributes: [Object],
user_name__c: 'testname_Node_20160912_020629',
user_email__c: 'testname_Node_20160912_020629@hoge.example.com',
create_date__c: '2016-09-12' },
{ attributes: [Object],
user_name__c: 'testname_Node_20160912_015615',
user_email__c: 'testname_Node_20160912_015615@hoge.example.com',
create_date__c: '2016-09-12' },
{ attributes: [Object],
user_name__c: 'SalesForce APIテスト',
user_email__c: 'example@hoge.example.com',
create_date__c: '2016-09-07' } ] }
[ec2-user@example-salesforce-api-test-nodejs select_salesforce_api_test]$


Node.jsからSalesforce REST APIを実行してカスタムオブジェクトにレコードを追加する (Salesforce REST APIクレデンシャルを.bashrcの環境変数から取得する例)

.bashrcの環境変数にSalesforce REST API接続用の設定(APIクレデンシャル)を追加しておく事で、Node.jsでSalesforce REST APIを実行する際、環境変数からAPIクレデンシャルを取得して、Salesforce REST APIを実行させる事も可能です。

まず.bashrcにSalesforce REST API接続用の設定を追加します。


/home/ec2-user/.bashrc

[ec2-user@salesforce-api-test ~]$ vi /home/ec2-user/.bashrc

 (末尾に以下を追加する)

### Sandbox環境へ接続する場合のAPIエンドポイント
##export DATABASEDOTCOM_HOST="test.salesforce.com"
### 本番環境へ接続する場合のAPIエンドポイント
export DATABASEDOTCOM_HOST="login.salesforce.com"

export DATABASEDOTCOM_CLIENT_ID="前述の「コンシューマ鍵」(OAuthコンシューマキー)を記載します。"
export DATABASEDOTCOM_CLIENT_SECRET="前述の「コンシューマの秘密」(OAuthコンシューマシークレット)を記載します。"
export DATABASEDOTCOM_CLIENT_USERNAME="APIを有効化しているSalesforceユーザアカウント名を記載します。"
export DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD="APIを有効化しているSalesforceユーザアカウントのパスワードを記載します。"


.bashrcに追加した環境変数を読み込みます。

[ec2-user@example-salesforce-api-test-nodejs ~]$ source /home/ec2-user/.bashrc

[ec2-user@example-salesforce-api-test-nodejs ~]$

Node.jsで.bashrcから環境変数からAPIクレデンシャルを取得する場合、以下のプログラムに変更します。

ec2-user@example-salesforce-api-test-nodejs ~]$ cd insert_salesforce_api_test/

[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$ pwd
/home/ec2-user/insert_salesforce_api_test
[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$

[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$ vi /home/ec2-user/insert_salesforce_api_test/index.js
require('date-utils');


/home/ec2-user/insert_salesforce_api_test/index.js

var jsforce = require('jsforce');

// Salesforce REST APIエンドポイント
var oauth_login_url = 'https://' + process.env.DATABASEDOTCOM_HOST;

// Salesforce REST APIで接続するアプリケーションの「コンシューマ鍵」を設定する
var oauth_client_id = process.env.DATABASEDOTCOM_CLIENT_ID;

// Salesforce REST API接続用のSalesforceユーザ名を設定する
var oauth_client_username = process.env.DATABASEDOTCOM_CLIENT_USERNAME;

// Salesforce REST APIで接続するアプリケーションの「コンシューマの秘密」を設定する
var oauth_client_secret = process.env.DATABASEDOTCOM_CLIENT_SECRET;

// Salesforce REST API接続用のSalesforceユーザのパスワードを設定する
var oauth_client_authenticate_password = process.env.DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD;

var sobject_name = 'QuickStart__c';

// Salesforce REST APIへ接続する時の「コンシューマ鍵」(OAuthコンシューマキー等)をセットする
var conn = new jsforce.Connection({
oauth2 : {
loginUrl : oauth_login_url,
clientId : oauth_client_id,
clientSecret : oauth_client_secret
}
});

// カスタムオブジェクトへ追加するデータをセット
var date = new Date();
var insert_time = date.toFormat("YYYYMMDD_HH24MISS");
var insert_name = "testname_Node_" + insert_time;
var insert_email = insert_name + "@hoge.example.com";
var create_date = date.toFormat("YYYY-MM-DD");

var insert_record = {
user_name__c: insert_name,
user_email__c: insert_email,
create_date__c: create_date
};

console.log("Salesforce REST API Insert Record");
console.log(insert_record);

// Salesforce REST APIへ接続する
conn.login( oauth_client_username, oauth_client_authenticate_password, function(err, res) {
if (err) { return console.error(err); }

// Salesforce REST APIを実行してカスタムオブジェクトへレコードを追加する
conn.sobject( sobject_name ).create( insert_record, function(err, res) {
if (err) { return console.error(err); }
console.log(res);
});
});


Node.jsプログラムを実行すると、Force.comカスタムオブジェクトにレコードを追加出来ます。

[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$ pwd

/home/ec2-user/insert_salesforce_api_test
[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$
[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$ node /home/ec2-user/insert_salesforce_api_test/index.js
Salesforce REST API Insert Record
{ user_name__c: 'testname_Node_20170311_123050',
user_email__c: 'testname_Node_20170311_123050@hoge.example.com',
create_date__c: '2017-03-11' }
{ id: 'a032800000QEaALAA1', success: true, errors: [] }
[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$


Node.jsからSalesforce REST APIを実行してカスタムオブジェクトのレコードを表示する (Salesforce REST APIクレデンシャルを.bashrcの環境変数から取得する例)

.bashrcの環境変数にSalesforce REST API接続用の設定(APIクレデンシャル)を追加しておく事で、Node.jsでSalesforce REST APIを実行する際、環境変数からAPIクレデンシャルを取得して、Salesforce REST APIを実行させる事も可能です。

まず.bashrcにSalesforce REST API接続用の設定を追加します。


/home/ec2-user/.bashrc

[ec2-user@salesforce-api-test ~]$ vi /home/ec2-user/.bashrc

 (末尾に以下を追加する)

### Sandbox環境へ接続する場合のAPIエンドポイント
##export DATABASEDOTCOM_HOST="test.salesforce.com"
### 本番環境へ接続する場合のAPIエンドポイント
export DATABASEDOTCOM_HOST="login.salesforce.com"

export DATABASEDOTCOM_CLIENT_ID="前述の「コンシューマ鍵」(OAuthコンシューマキー)を記載します。"
export DATABASEDOTCOM_CLIENT_SECRET="前述の「コンシューマの秘密」(OAuthコンシューマシークレット)を記載します。"
export DATABASEDOTCOM_CLIENT_USERNAME="APIを有効化しているSalesforceユーザアカウント名を記載します。"
export DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD="APIを有効化しているSalesforceユーザアカウントのパスワードを記載します。"


.bashrcに追加した環境変数を読み込みます。

[ec2-user@example-salesforce-api-test-nodejs ~]$ source /home/ec2-user/.bashrc

[ec2-user@example-salesforce-api-test-nodejs ~]$

Node.jsで.bashrcから環境変数からAPIクレデンシャルを取得する場合、以下のプログラムに変更します。

[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$ cd ~

[ec2-user@example-salesforce-api-test-nodejs ~]$
[ec2-user@example-salesforce-api-test-nodejs ~]$ cd insert_salesforce_api_test/
[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$ pwd
/home/ec2-user/insert_salesforce_api_test
[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$
[ec2-user@example-salesforce-api-test-nodejs insert_salesforce_api_test]$ vi /home/ec2-user/insert_salesforce_api_test/index.js


/home/ec2-user/insert_salesforce_api_test/index.js

var jsforce = require('jsforce');

// Salesforce REST APIエンドポイント
var oauth_login_url = 'https://' + process.env.DATABASEDOTCOM_HOST;

// Salesforce REST APIで接続するアプリケーションの「コンシューマ鍵」を設定する
var oauth_client_id = process.env.DATABASEDOTCOM_CLIENT_ID;

// Salesforce REST API接続用のSalesforceユーザ名を設定する
var oauth_client_username = process.env.DATABASEDOTCOM_CLIENT_USERNAME;

// Salesforce REST APIで接続するアプリケーションの「コンシューマの秘密」を設定する
var oauth_client_secret = process.env.DATABASEDOTCOM_CLIENT_SECRET;

// Salesforce REST API接続用のSalesforceユーザのパスワードを設定する
var oauth_client_authenticate_password = process.env.DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD;

// Salesforce カスタムオブジェクトに対して実行するSOQLを設定する
var sobject_name = 'QuickStart__c';
var soql = 'SELECT user_name__c, user_email__c, create_date__c FROM ' + sobject_name;

// Salesforce REST APIへ接続する時の「コンシューマ鍵」(OAuthコンシューマキー等)をセットする
var conn = new jsforce.Connection({
oauth2 : {
loginUrl : oauth_login_url,
clientId : oauth_client_id,
clientSecret : oauth_client_secret
}
});

console.log("Salesforce REST API Test SELECT SOQL [" + soql + "]");

// Salesforce REST APIへ接続する
conn.login( oauth_client_username, oauth_client_authenticate_password, function(err, res) {
if (err) { return console.error(err); }

// Salesforce REST APIを実行してカスタムオブジェクトへレコードを追加する
conn.query( soql, function(err, res) {
if (err) { return console.error(err); }
console.log(res);
});
});


Node.jsプログラムを実行すると、Force.comカスタムオブジェクトに登録されているレコードを表示出来ます。

[ec2-user@example-salesforce-api-test-nodejs select_salesforce_api_test]$ pwd

/home/ec2-user/select_salesforce_api_test
[ec2-user@example-salesforce-api-test-nodejs select_salesforce_api_test]$ node /home/ec2-user/select_salesforce_api_test/index.js
SalesForce REST API Test SELECT SOQL [SELECT user_name__c, user_email__c, create_date__c FROM QuickStart__c]
{ totalSize: 62,
done: true,
records:
[ { attributes: [Object],
user_name__c: 'テスト太郎',
user_email__c: 'test.tarou@example.com',
create_date__c: null },
{ attributes: [Object],
user_name__c: 'テスト次郎',
user_email__c: 'test.jirou@example.com',
create_date__c: null },

 (出力結果長いので中略)

user_name__c: 'testname_Node_20170311_114546',
user_email__c: 'testname_Node_20170311_114546@hoge.example.com',
create_date__c: '2017-03-11' },
{ attributes: [Object],
user_name__c: 'testname_Node_20170311_122616',
user_email__c: 'testname_Node_20170311_122616@hoge.example.com',
create_date__c: '2017-03-11' } ] }
[ec2-user@example-salesforce-api-test-nodejs select_salesforce_api_test]$


以上になります。