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

はじめに
===

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
```

```Node.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
```

```Node:/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接続用の設定を追加します。

```bash:/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');
```

```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;

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接続用の設定を追加します。

```bash:/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
```

```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]$ 
```

***

以上になります。