使用原生的Node.js驱动程序将MongoDB的结果写入文件。

4
我正在尝试使用本地的Node.js驱动程序将MongoDB查询结果写入文件。 我的代码如下(基于此帖子:在Node.js中编写文件):
var query = require('./queries.js');
var fs = require('fs');

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
    if(err) { return console.dir(err); }

    var buildsColl = db.collection('blah');

    collection.aggregate(query.test, function(err, result) {
        var JSONResult = JSON.stringify(result);
        //console.log(JSONResult);

        fs.writeFile("test.json", JSONResult, function(err) {
            if(err) {
                console.log(err);
            } else {
                console.log("The file was saved!");
            }
        });
    });

    collection.aggregate(query.next, function(err, result) {
        var JSONResult = JSON.stringify(result);
        //console.log(JSONResult);
        db.close();
    });

});

文件已经写入,但内容为“未定义”。不过可以将结果打印到控制台。
2个回答

2

对于任何偶然发现此问题的人,下面是在哪里放置db.close()的解决方案:

collection.aggregate(query.test, function(err, result) {
    var JSONResult = JSON.stringify(result);
    //console.log(JSONResult);

    fs.writeFile("test.json", JSONResult, function(err) {
        if(err) {
            console.log(err);
        } else {
            console.log("The file was saved!");
        }
    });

    collection.aggregate(query.next, function(err, result) {
        var JSONResult = JSON.stringify(result);
        //console.log(JSONResult);
        db.close();
    });
});

2

你的代码没有在聚合回调函数上检查 err

你可能会收到一个Mongo错误,此时结果为undefined...

我怀疑的另一件事是,你可能会得到多个回调 -- 每个回调都会创建一个新文件,擦除内容。

尝试使用 fs.appendFile 而不是 fs.writeFile,看看是否获得了预期的数据(以及不需要的undefined


谢谢您的建议,但是我在文件中仍然得到了“未定义”的结果。 - JamesE
1
我刚注意到你没有对聚合回调函数进行错误检查 - 我刚更新了答案以反映这一点。 - Soren
就是这样。我在第二个collection.aggregate块中过早地关闭了与数据库的连接。现在我只需要弄清楚在哪里放置关闭语句即可。已经在上面发布了更新的代码。 - JamesE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接