2

pgデータベースと対話するために postgres ノード モジュールを使用しています。pgのイベント APIを使用すると、コードは問題なく動作します。以下はコードの例です。

Migration.js

 exports.up = function(logger){
    var pg = require("pg")
        , connectionString = //process.env.CONNECTIONSTRING
        , client = new pg.Client(connectionString);

    client.connect();

    var cmd = "CREATE TABLE users( "
                + "id SERIAL NOT NULL, "
                + "firstName VARCHAR(50) NOT NULL, "
                + "lastName VARCHAR(50) NOT NULL, "
                + "CONSTRAINT pk_userid PRIMARY KEY (id) "
                + ")";

    var query = client.query(cmd);

    query.on("end", function(){
        client.end();
            logger.log("complete");
    });
};

commander.jsを使用して、この移行スクリプトに関するコマンド ライン ユーティリティを作成しています。ただし、スニペットのノンブロッキング呼び出しによりpg、データベースの更新が完了する前にコマンド ライン インターフェース スクリプトが解放されます。以下は、コマンダーのスニペットの例です。

MyCliTool

var program = require('commander');

program
    .version('1.0.2');

program
    .command("up")
    .description("Migrates up")
    .action(function(){
        require("../src/migration").up();
    });

// Additional code removed for brevity

移行 (またはcommander.jsアプリ) スクリプトを変更up()して、cli スクリプトが終了する前に移行の機能が終了するようにする方法はありますか? コールバックを使用してみましたが、機能していないようです。

更新 この点を説明する別の例。mocha以下は、問題に関する単体テスト ( で記述) です。

アップテスト.js

describe("feature", function(){
    it("should finish", function(){
        var logger = {};
        var finished = false;
        logger.log = function(){finished = true;};

        var migration = require("../src/migration.js");
        migration.up(logger);
        assert(finished, "function didn't finish"); // finished is false when this gets called.
    });
});
4

2 に答える 2

3

元のスクリプトには問題点があるようprogram.action(function () {});です:

program
    .command("up")
    .description("Migrates up")
    .action(function(){
        require("../src/migration").up();

        // nothing preventing this function from exiting immediately
    });

commander.js のドキュメントを少し調べてみましたが、.action()プログラムへのコールバックの提供に関する情報は見つかりませんでした。私が書いていたら、コードは次のようになります。

program
    .command("up")
    .description("Migrates up")
    .action(function (completedCallback) {

        require("../src/migration").up(function () {
            // migration is complete
            completedCallback();
        });

    });

ただし、postgre 関連のスクリプトは問題ないように見えます。変数を使用する代わりに、可視性を持たせたいイベントrequire("../src/migration").up();のインスタンスを返して発行することは、多少関係のないことかもしれません。しかし、それは単なる好みです。require("events").EventEmitterlogger

于 2012-07-06T21:57:39.393 に答える
0

タイマーを設定してみてください (http://nodejs.org/api/timers.html)。Azure CLI ツール内でこれを行い、実行時間の長い操作を実行しているときにスピナーを実行します。

https://github.com/WindowsAzure/azure-sdk-for-node/blob/master/lib/cli/cli.jsでコードを掘り下げて、その方法を確認できます。progress() 関数を検索します。

于 2012-07-07T04:39:36.373 に答える