Node.js で Harvest のデータを MySQL データベースとしてクエリ
Harvest 用の ODBC Driver の SQL Gateway を使用すると、MySQL インターフェース経由でHarvest のデータをクエリできます。以下の手順に従って、SQL Gateway の MySQL リモーティングサービスを起動し、Node.js からクエリを開始してください。
Harvest のデータに接続
まだ行っていない場合は、データソース名(DSN)で必要な接続プロパティの値を指定してください。組み込みの Microsoft ODBC データソースアドミニストレーターを使用して DSN を設定できます。これはドライバーインストールの最後のステップでもあります。Microsoft ODBC データソースアドミニストレーターを使用して DSN を作成・設定する方法については、ヘルプドキュメントの「はじめに」の章を参照してください。
まず、Profile 接続プロパティをディスク上のHarvest プロファイルの場所に設定します(例:C:\profiles\Harvest.apip)。次に、ProfileSettings 接続プロパティをHarvest の接続文字列に設定します(以下を参照)。
Harvest API プロファイル設定
Harvest に認証するには、トークン認証またはOAuth 標準のいずれかを使用できます。自分のデータに接続するにはBasic 認証を使用します。他のユーザーが自分のデータに接続できるようにするにはOAuth を使用します。
トークン認証の使用
トークン認証を使用するには、ProfileSettings 接続プロパティでAPIKey にHarvest パーソナルアクセストークンを設定します。APIKey に加えて、ProfileSettings でAccountId を設定して接続します。
OAuth 認証の使用
まず、Harvest でOAuth2 アプリケーションを登録します。アプリケーションはHarvest ID の「Developers」セクションから作成できます。
以下の接続プロパティを設定すると、接続できるようになります。
- ProfileSettings:ProfileSettings でAccountId を設定します。
- AuthScheme:OAuth に設定します。
- OAuthClientId:アプリ設定で指定したclient ID に設定します。
- OAuthClientSecret:アプリ設定で指定したclient secret に設定します。
- CallbackURL:アプリ設定で指定したRedirect URI に設定します。
- InitiateOAuth:GETANDREFRESH に設定します。InitiateOAuth を使用して、ドライバーがOAuthAccessToken を取得および更新する方法を管理できます。
SQL Gateway を設定
SQL Gateway 概要を参照して、Harvest のデータ を仮想 MySQL データベースとして接続を設定してください。クライアントからの MySQL リクエストをリッスンする MySQL リモーティングサービスを設定します。サービスは SQL Gateway UI で設定できます。

Node.js から Harvest をクエリ
以下の例では、mysql モジュールを使用して Harvest への接続を定義し、クエリを実行する方法を示しています。以下の情報が必要です。
- ホスト名またはアドレス、およびポート:MySQL リモーティングサービスが MySQL 接続をリッスンしているマシンとポート
- ユーザー名とパスワード:SQL Gateway の Users タブで認証したユーザーのユーザー名とパスワード
- データベース名:MySQL リモーティングサービス用に設定した DSN
以下のコードでHarvest のデータに接続し、クエリの実行を開始できます。
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
database : 'CData API Sys',
port : '3306',
user : 'mysql_user',
password : 'test'
});
connection.connect();
connection.query('SELECT * FROM Invoices', function(err, rows, fields) {
if (err) throw err;
console.log(rows);
});
connection.end();