通过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,而是返回一个对象stdout
, stdin
和error
属性(等)。 有关更多详细信息,请查看文档 。
如果使用节点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处理程序。