JavaScript から Salesforce API をコールする

## ゴール
JavaScript から Salesforce API をコールする

## 前回の記事

https://qiita.com/skizaki/items/bb333b0c782e8a631dfa

## プログラムの実行環境について
AWS Cloud9 から JavaScript を実行しますが、Node.js が動作する環境であれば OK です。

以下、本記事の環境。

AWS Cloud9 ： AWSの統合開発環境（IDE）
（Node.js, Python, Ruby, Java, Go, C# とかでプログラム記述可能）
AWS EC2 ： AWS上の仮想サーバー（Cloud9はEC2インスタンスとして動作します）
Node.js ： サーバサイド JavaScipt 実行環境
JSforce ：Salesforce API に アクセスできる JavaScript ライブラリ

## AWS Cloud9
AWS Cloud9 は、ブラウザのみでコードを記述、実行、デバッグできるクラウドベースの統合開発環境 (IDE) です。Cloud9 には、JavaScript, Python, PHP などの一般的なプログラム言語に不可欠なツールがあらかじめパッケージ化されています。今回は、Salesforce Web API と連携したウェブアプリケーションを開発・テストする環境として使います。Amazon Linux 2　は、RedHat 系のディストリビューションであるため、Red Hat Enterprise Linux(RHEL) や CentOS, Fedora とほぼ同じように使うことが可能です。

```shell:shell
ec2-user:~/environment $ cat /etc/os-release 
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
```

## Node.js
Node.js は、JavaScript の実行環境です。Webサーバなどのスケーラブルなネットワークプログラムの記述する場合に適した環境です。Salesforce の開発でお馴染みの Visual Studio Code も Node.js で作られてます。AWS Cloud9 は、Node.js がインストール済みで利用することが可能です。

```shell:shell
ec2-user:~/environment $ node --version
v16.15.1
```

参考：AWS Cloud9 の Node.js サンプル

https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/sample-nodejs.html

## JSforce
JSforce (別名 Node-Salesforce) は、Salesforce の API を利用した JavaScript ライブラリです。Node.js 上で動作させることが可能です。非同期の JavaScript 関数呼び出しで Salesforce が提供するさまざまな API へのアクセスすることができます。コマンドラインインターフェイス (CLI) も用意されており、手軽に実行することが可能です。

https://jsforce.github.io/

```shell:shell
ec2-user:~/environment $ npm install -g jsforce
```

## サンプルプログラムを実行してみよう
上記の環境が用意できたら、Trailhead のサンプルプログラムを実行してみましょう。

参考：プラットフォーム API の基本＞REST API を使用する 

https://trailhead.salesforce.com/ja/content/learn/modules/api_basics/api_basics_rest

>Postman からコードの記述へ移行すると、選択したプログラム言語を使用して REST API を操作することになります。幸いにも、エキスパートの Salesforce 開発者によって、REST API の消費プロセスを簡略化するラッパーがいくつかの言語で記述されています。Node.js および Ruby で記述された 2 つのサンプルクエリを次に示します。それぞれ、JSforce および Restforce のラッパーを使用しています。

## JSforce を使用した Node.js の例

```javascript:index.js
const jsforce = require("jsforce");
const conn = new jsforce.Connection({
  // you can change loginUrl to connect to sandbox or prerelease env.
  // loginUrl : "https://test.salesforce.com"
});
// Log in with basic SOAP login (see documentation for other auth options)
conn.login(
  'Salesforce のユーザID',
  'パスワード' + 'セキュリティトークン',
  (err, res) => {
    if (err) {
      return console.error("Failed to log in to Salesforce: ", err);
    }
    console.log("Successfully logged in!");
    // Run a SOQL query
    conn.query("SELECT Id, Name FROM Account LIMIT 5", (err, result) => {
      if (err) {
        return console.error("Failed to run SOQL query: ", err);
      }
      // Display query results
      const { records } = result;
      console.log(`Fetched ${records.length} records:`);
      records.forEach(record => {
        console.log(`- ${record.Name} (${record.Id})`);
      });
    });
  }
);
```
興味がある方は、JSforce ライブラリの connection.js で何をしているか読んでみましょう。

参考：JSforce のドキュメント（connection.js）

http://jsforce.github.io/jsforce/doc/connection.js.html

Node.js の実行
```shell:shell
ec2-user:~/environment $ node index.js
```

## セキュリティトークン
セキュリティトークンとは、信頼されている IP 範囲の外にある IP アドレスから、API を使用して Salesforce にアクセスする場合、ログインするにはセキュリティトークンが必要です。セキュリティトークンとは、パスワードに付加したり、クライアントアプリケーションの独立した項目に入力したりする、大文字と小文字を区別する英数字のコードです。例えば、データローダから Salesforce にアクセスする際に必要になったりします。API を使用する場合は、上記の通り、セキュリティトークンをパスワードに付加します。

[右上の顔のマークのアイコン]＞[私のセキュリティトークンのリセット] からセキュリティトークンを再設定することが可能です。

![securitytoken.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689091/23edc78b-dd8d-9491-7c85-458d7702486f.png)

参考：セキュリティトークンのリセット

https://help.salesforce.com/s/articleView?id=sf.user_security_token.htm&type=5

参考：「ログイン履歴に API セキュリティトークンが必要です」の表示が出る場合の対処方法

https://help.salesforce.com/s/articleView?id=000386167&type=1

## まとめ
本稿では、Node.js 上から JSforce ライブラリを利用することで、プログラムから簡単にアクセスできることを確認しました。AWS の環境は必須ではありませんが、プログラムを色々と試すにはよいかと思います。Node.js は、JavaScript の実行環境であり、その上で動作する JavaScript のライブラリが JSforce です。Salesforce をプログラムから API 経由でアクセスするためには、セキュリティトークンも必要になります。セキュリティトークンは必要に応じて取得してください。

おわり。