您好我正在撰写tests in Protractor
,我希望在conf.js
中进行一些数据库还原,我正在spawn
项目中使用Node.Js
进行node shell command
}}
代码可以正常运行并恢复数据库。但主要问题是它作为异步工作,主线程不等待恢复完成。
这是我的代码。
var dbServer = '(local)';
var spawn = require('child_process').spawn;
spawn('sqlcmd', ['-S', dbServer, '-i', 'resources/databaseRestore.sql'] ,function (error, stdout, stderr) {
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
if (error !== null) {
console.log('exec error: ' + error);
}
});
我可以等待此功能在任何其他工作之前执行吗?我已经看到了require('fs')
的一些示例,但不确定如何实现它。
答案 0 :(得分:2)
节点0.12,刚刚发布,包括child_process
函数的同步变体。因此,如果你可以使用0.12,那么使用spawnSync()
代替spawn()
就可以了。如果你走这条路线,请注意spawnSync不接受回调,而是返回一个对象stdout
,stdin
和error
属性(以及其他)。有关更多详细信息,请查看documentation。
如果使用节点0.12不是一个选项,您可以等待您生成的进程退出,然后继续执行其余代码。 spawn()
返回一个子对象,该子对象在子进程完成时发出一个事件。
var child = spawn(...);
child.on('exit', function(code, signal) {
//code and signal might tell you if the process was succesful.
continueWithMainLogic();
});
BTW,据我所知,spawn()
命令不接受回调,所以在你的例子中,永远不会调用该回调函数。 exec()
确实采用了类似于示例中的回调,它在生成的进程结束后被调用。因此,当使用exec()
时,您可以使用该回调而不是exit even handler。