通过shell命令在Node.js中执行同步事件

您好我正在编写tests in Protractor ,我想在conf.js做一些数据库还原,我通过使用node shell command通过Node.Js项目spawn

该代码确实工作正常,并恢复数据库。 但主要的问题是它作为asynchronous,主线程不等待恢复完成。

这是我的代码。

 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.12包含了child_process函数的同步变体。 所以,如果你可以使用0.12,使用spawnSync()而不是spawn()将做的伎俩。 如果你走这条路线,请注意,spawnSync不会callback,而是返回一个对象stdoutstdinerror属性(等)。 有关更多详细信息,请查看文档 。

如果使用节点0.12不是一个选项,您可以等待您生成的进程退出,然后继续执行其余的代码。 spawn()返回一个子对象,子对象在subprocess完成时发出一个事件。

 var child = spawn(...); child.on('exit', function(code, signal) { //code and signal might tell you if the process was succesful. continueWithMainLogic(); }); 

顺便说一句,据我所知spawn()命令不接受callback,所以在你的例子中,该callback函数将永远不会被调用。 exec()确实需要一个callback,就像在你的例子中那样,在它产生的进程结束之后被调用。 所以当使用exec() ,你可以使用这个callback来代替exit even处理程序。