LoginSignup
8
8

More than 5 years have passed since last update.

node.js on functionsのlocal開発環境の作り方

Last updated at Posted at 2017-01-06

Azureのfunctions上をnode.jsでプログラミングする場合、プログラムを修正する度、毎回funcionsにデプロイして動作確認する、という繰り返しは効率が悪いので、localでも同じソースが動く用な雛形を作ってみました。

localでも動くnode.jsの書き方

まず結論

適当な実行用ファイル、例えばrun.jsを用意して

run.js
// functionsメインのindex.js読み込み
var main = require("./index");

// index.jsに渡すcontextオブジェクト
var context = {
    log:function(v){
        console.log(v);
    },
    done:function(){
        console.log("function complete");
    }
}

// メイン処理
new main(context,null);

これだけでok。あとはこれを実行する。

$node run.js

こうすることで、functions上で動くindex.jsをローカルでも動かせます。

解説

functionsの構成

まず、funtionsはindex.jsfunction.jsonが最小構成になっています。メインの処理となるindex.jsは以下のようなソースが最小の形になります。

index.js
module.exports = function (context, trigger) {
    // debug
    context.log("ログ表示");

    // メインの処理
    // ・・・・

    // functions終了処理
    context.done();
}

ポイントは以下で

  • module.exportsのfunctionの引数は2つで、contexttrigger
    • context・・・functions内の独自オブジェクト
    • trigger・・・functionsに渡されるtriggerに関する値
  • context.done()はfunctions終了処理で、これが呼び出されないとtimeout errorになるまでプロセスが残る
  • ログ表示はconsole.log()では無く、書いても何も表示されない。debugはcontext.log()で、log window1に表示される

contextへの対応

つまり、ローカル環境で、ログを表示したり、functionsの終了処理を呼び出そうとすると、このcontextオブジェクトをlocalで動作させる必要があります。
そこで、run.jsで、contextオブジェクトを用意してます。

run.jsの一部
// index.jsに渡すcontextオブジェクト
var context = {
    // ログ表示処理
    log:function(v){
        console.log(v);
    },
    // 疑似終了処理
    done:function(){
        console.log("function complete");
    }
}

これで、functions上で動作するindex.jsがlocalでも動作するようになります。

補足

ログ表示は上記でとりあえずは可能なのですが、context変数はこのままだとmodule.exports内でしか使えません。そこで、以下のように対応したのが現状です。

index.js
// グローバル?にデバッグ用変数用意
var debug;

// メイン関数
function main_function(){
    // こうすることで、module.exports外部でもログ表示できる
    debug.log("ログ表示");

    // やりたい処理
    // ・・・・・

    // functions終了処理もここで呼び出せる
    debug.done();
}

module.exports = function (context, trigger) {
    // contextをdebugにセット。以降、debugを利用
    debug = context;

    // メインの処理
    main_function();
}

もっとスマートな方法がある気がしてます。あればコメントお願い致します!


  1. log windowはこちらを参考 -> Azure functions ログの参照方法まとめ 

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