我正在使用 pg
postgres Node 模块与我的数据库进行交互。当我使用 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
编写)。
Up-test.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.
});
});
最佳答案
看起来您的原始脚本在 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").EventEmitter
的实例并发出您想要查看的事件,而不是使用 logger
变量。但这只是偏好。
关于javascript - Node.js - 确保非阻塞调用完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11369436/