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

时间:2015-03-13 04:56:48

标签: node.js protractor spawn

您好我正在撰写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')的一些示例,但不确定如何实现它。

1 个答案:

答案 0 :(得分:2)

节点0.12,刚刚发布,包括child_process函数的同步变体。因此,如果你可以使用0.12,那么使用spawnSync()代替spawn()就可以了。如果你走这条路线,请注意spawnSync不接受回调,而是返回一个对象stdoutstdinerror属性(以及其他)。有关更多详细信息,请查看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。