前提
・空のAzureFunctionsの関数ができている。
・どこかに、SQLServerがたっている。
SQL接続には、tediousドライバーを使用します。
https://www.npmjs.com/package/tedious
急ぎ、他人に伝える必要があったので、手順をメモ程度に。
以下では、tediousのazurefunctionsへのインストール手順とサンプルコードで接続確認を行います。
手順
- azureポータルの「プラットフォーム機能」メニューより、「コンソール」を起動する。
>cd HttpTriggerJS1
HttpTriggerJS1>npm init -y
HttpTriggerJS1>npm install tedious --save
- 適当なコードを追加する。
この例では、index.jsの先頭に、以下でも追加して見る。
phonebookというテーブルが、xxxx.database.windows.netの、ddddというデータベースにある前提。
データベースユーザーは、ID/Passwordが、uuuu/ppppとする。
var Connection = require('tedious').Connection;
var TedRequest = require('tedious').Request;
var TYPES = require('tedious').TYPES;
function scan_table(context, q_name){
//データベース接続情報
var config = {
userName: 'uuuu',
password: 'pppp',
server: 'xxxx.database.windows.net',
options: {
encrypt: true,
database: 'dddd'
}
};
//SQLは、一応、prepared statementにする。
var query = "SELECT [familyname], [mobilenumber] "+
"FROM [dbo].[phonebook] "+
"WHERE [familyname] = @WHO";
//CreateConnection
var connection = new Connection(config);
//接続
connection.on('connect', function(err) {
if(err){
//Error Handling
} else {
// SQL実行
results = executeStatement(query, obj);
}
});
connection.on('end', function(err){
console.log("connection End");
});
//SQL実行の実体
function executeStatement(query) {
//応答を詰め込むバッファ
var arr = [];
var con_cnt = 2; //取得する列数
console.log("executeStatement start");
queryrequest = new TedRequest(query, function(err){
if (err) {
console.log(err);
} else {
//応答を返す場所。
//arrをいい感じに処理する。
context.log(arr[0][0]+arr[0][1]);
}
});
//検索条件の指定
queryrequest.addParameter('WHO', TYPES.NVarChar, q_name);
queryrequest.on('row', function(columns) {
//見つかった。
var record = new Array(con_cnt);
var i = 0;
columns.forEach( function(column) {
record[i++] = column.value;
});
arr.push(record);
});
queryrequest.on('requestCompleted', function(rowCount, more){
connection.close();
});
connection.execSql(queryrequest);
return;
}
}
index.jsからよびだしてみる。
module.exports = function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
if (req.query.name || (req.body && req.body.name)) {
context.res = {
// status: 200, /* Defaults to 200 */
body: "Hello " + (req.query.name || req.body.name)
};
//データベースアクセスと応答
scan_table(context, req.query.name);
}
else {
context.res = {
status: 400,
body: "Please pass a name on the query string or in the request body"
};
}
context.done();
};
動かして見る。
azureポータルの「実行ボタン」横の「関数のURLの取得」で取り出したURLに対して、別ブラウザーから、?name=xxxをつけて、Functionsを呼び出して見る。xxxが、SQLのWHERE句になる。
azureポータルでは、関数画面を表示したままにする。
すると、azureポータルのログ画面に、結果が出るはず。