5
1

More than 5 years have passed since last update.

Azure Functions から SQLServerに接続する(node.js編)

Last updated at Posted at 2018-09-06

前提

・空のAzureFunctionsの関数ができている。
・どこかに、SQLServerがたっている。

SQL接続には、tediousドライバーを使用します。
https://www.npmjs.com/package/tedious

急ぎ、他人に伝える必要があったので、手順をメモ程度に。

以下では、tediousのazurefunctionsへのインストール手順とサンプルコードで接続確認を行います。

手順

  1. azureポータルの「プラットフォーム機能」メニューより、「コンソール」を起動する。
>cd HttpTriggerJS1
HttpTriggerJS1>npm init -y
HttpTriggerJS1>npm install tedious --save

  1. 適当なコードを追加する。

この例では、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();
};

動かして見る。

screen4-1.png

azureポータルの「実行ボタン」横の「関数のURLの取得」で取り出したURLに対して、別ブラウザーから、?name=xxxをつけて、Functionsを呼び出して見る。xxxが、SQLのWHERE句になる。

azureポータルでは、関数画面を表示したままにする。
すると、azureポータルのログ画面に、結果が出るはず。

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34333832392f61353236623130342d356130632d633732302d633962662d6632666365666335636433342e706e67.png

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1