В файле node.js (сценарий casperJS) функция execFile
из модуля child_process
используется для запуска сценария mongoScript.js
, который обращается к коллекции базы данных Mongodb.
execFile("node", 'mongoScript.js', null, function (err, stdout, stderr) {
console.log("execFileSTDOUT:", stdout);
console.log("execFileSTDERR:", JSON.stringify(stderr));
finished = true;
});
Где mongoScript.js
содержит асинхронную функцию collection.find
var mongojs = require('mongojs')
var db = mongojs()
var collection = db.collection('myCollection')
collection.find({}, function(err, docs) {
console.log('done')
db.close()
})
Проблема: кажется, что сценарий завершается до того, как collection.find
имеет изменение для печати done
. Как мы можем заставить его ждать завершения работы collection.find
?
2 ответа
Как сказано в документации, предполагается, что аргумент args
функции execFile
быть массивом:
execFile("node", ['mongoScript.js'], null, function (err, stdout, stderr) {
console.log("execFileSTDOUT:", stdout);
console.log("execFileSTDERR:", JSON.stringify(stderr));
finished = true;
});
Если это не массив, JavaScript, вероятно, попытается разбить строку на массив, и в этом случае фактически вызывается node m o n g o ...
.
Попробуй это
exec("node mongoScript.js"+childArgs,function (err, stdout, stderr) {
console.log("execFileSTDOUT:", stdout);
console.log("execFileSTDERR:", JSON.stringify(stderr));
finished = true;
});
exec("node mongoScript.js", childArgs, function (err, stdout, stderr) { ... }
дал ту же проблему.
node mongoScript.js
.... использование return
, похоже, не завершает процесс
mongoScript.js
содержит только exit()
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.
stdout.on('data', doSomething)
, то Node поймет, что он ожидает асинхронных операций, пока вы не закроете канал, и, таким образом, останется открытым. Тем не менее... я думал, что это будет делать то же самое, потому что вы передали обратный вызов execFile...