В файле 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?

0
Nyxynyx 14 Июл 2015 в 20:34
Что вы получаете console.log(stdout);
 – 
KlwntSingh
14 Июл 2015 в 20:41
Ничего
 – 
Nyxynyx
14 Июл 2015 в 20:57
Я думаю, что если вы привязываетесь к stdout.on('data', doSomething), то Node поймет, что он ожидает асинхронных операций, пока вы не закроете канал, и, таким образом, останется открытым. Тем не менее... я думал, что это будет делать то же самое, потому что вы передали обратный вызов execFile...
 – 
Plato
14 Июл 2015 в 21:12
1
Похоже, это проблема с CasperJS/PhantomJS. Я снова запустил родительский скрипт .js, используя node вместо casperjs, и дочерний процесс завершился.
 – 
Nyxynyx
14 Июл 2015 в 21:27

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 ....

1
Artjom B. 14 Июл 2015 в 22:43

Попробуй это

exec("node mongoScript.js"+childArgs,function (err, stdout, stderr) {
    console.log("execFileSTDOUT:", stdout);
    console.log("execFileSTDERR:", JSON.stringify(stderr));
    finished = true;
});
0
KlwntSingh 14 Июл 2015 в 21:00
Мне пришлось передать некоторые аргументы, и exec("node mongoScript.js", childArgs, function (err, stdout, stderr) { ... } дал ту же проблему.
 – 
Nyxynyx
14 Июл 2015 в 20:58
Это некоторое улучшение! Кажется, сейчас не выходит из exec node mongoScript.js.... использование return, похоже, не завершает процесс
 – 
Nyxynyx
14 Июл 2015 в 21:04
Еще нет... скрипт узла не завершается
 – 
Nyxynyx
14 Июл 2015 в 21:07
Написать exit() после db.close()
 – 
KlwntSingh
14 Июл 2015 в 21:08
По-прежнему не выходит, даже если файл mongoScript.js содержит только exit()
 – 
Nyxynyx
14 Июл 2015 в 21:09