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.
});
});