gpt4 book ai didi

meteor - 为什么 insert() 会破坏 Meteor 方法中 wrapAsync 的 child_process.spawn() 处理程序?

转载 作者:行者123 更新时间:2023-12-02 03:26:20 25 4
gpt4 key购买 nike

我正在尝试在 Meteor 方法中使用 child_process.spawn()。我想从外部进程捕获 PID、stdout、stderr 和退出代码,并将所有这些存储在数据库中。

一切正常,直到我添加了第一个 insert() 调用。使用 insert(),只有一个“虚拟”文档被插入到数据库中。我在服务器控制台中没有收到任何错误消息。如果我注释掉第一个 insert(),则其他 insert() 调用会成功。

// server/app.js
var spawn = Npm.require('child_process').spawn;

Meteor.methods({
start: function() {
var child = spawn('ls', ['/tmp']);
var pid = child.pid;

var wrappedChildStdoutOn = Meteor.wrapAsync(child.stdout.on, child.stdout);
var wrappedChildStderrOn = Meteor.wrapAsync(child.stderr.on, child.stderr);
var wrappedChildOn = Meteor.wrapAsync(child.on, child);

// this insert() breaks upcoming insert() calls!
Stuff.insert({pid: pid, date: new Date(), type: 'dummy', data: 'dummy'});

wrappedChildStdoutOn('data', function (data) {
Stuff.insert({pid: pid, date: new Date(), type: 'stdout', data: data.toString()});
});

wrappedChildStderrOn('data', function (data) {
Stuff.insert({pid: pid, date: new Date(), type: 'stderr', data: data.toString()});
});

wrappedChildOn('exit', function (code) {
Stuff.insert({pid: pid, date: new Date(), type: 'exit', code: code});
});
}
});

第一个 insert() 调用是怎么回事?

Here's a Meteor app demonstrating the issue .

最佳答案

insert 需要一些时间,因此 lsinsert 完成之前完成其输出。当您将事件处理程序放置到位时,为时已晚。

您可以通过将第一个 insert 移动到末尾,将第一个 insert 移动到 spawn 调用之前,或添加一个insert 的无操作 function () {} 回调,因此它被异步调用。

关于meteor - 为什么 insert() 会破坏 Meteor 方法中 wrapAsync 的 child_process.spawn() 处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30117845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com