Mongoose 回调无法使用 Forever

Mongoose callback not working using Forever

我正在尝试 运行 使用 Forever 的后台进程,每小时将来自外部服务的数据添加到我的 mongodb 数据库中(我是节点的新手,不知道该怎么做这个)。我将 Node 与 Express 一起使用,运行使用

完成永远的任务
forever -o out.log -e err.log start background/collector.js

所以我从这个过程中得到了一些反馈。代码如下:

var request = require('request');
var mongoose = require('mongoose');
var Model = require('../models/Model.js');

// Starting the collector process
addNewData();

function addNewData() {
    request('external_service_url', function (error, response, body) {
        if (!error && response.statusCode == 200) {
            var models = JSON.parse(body);

            console.log('Adding the new models...')
            for(var i = 0; i < models.length; i++)
            {
                console.log(i);

                Model.create(models[i], function (error, post, result) {
                    console.log('Test');
                    if (error) console.log('Something went wrong adding the document!');
                    if ( ! result.updatedExisting)
                    {
                        console.log('A new document has been added!');
                    }
                });
            }

            console.log('Models added: ' + models.length);

            // Every hour we will collect new data

            console.log('Waiting for an hour...');
            setTimeout(addNewData, 36000000);
        }
    })
}   

我不知道为什么,但似乎 .create() 回调不起作用,放置在创建回调中的 console.logs 没有在日志中显示任何内容。永远不适用于猫鼬?你有什么想法吗?

事情是这样的。你永远不会 "connected" 你的猫鼬适配器到数据库。只需添加以下内容即可修复:

mongoose.connect('mongodb://myhost/mydatabase');

在您尝试执行任何其他操作之前,请在靠近顶部的某个位置。它不一定按该顺序 "connect" ,但 mongoose 方法会解决它。 "Asynchronous Programming",请继续阅读其余内容。

此外,您不应该像这样循环,因为您不是在等待 "callback"(这不是闭包,而是回调)完成或 "throttle" 连接,这可能会导致问题。

使用类似 "async" instead to handle this. In this example the .eachLimit() 的方式将并行操作的数量限制在合理的水平:

async.eachLimit(models,10,function(el,callback) {
    Model.create(models[i], function (error, result) {
        // do something maybe but call
        callback(err);   // to signal it is done
    });
},function(err) {
    // comes here on completion or error
});

请记住,"asychronous" 代码需要在 "callbacks" 或 "promises" 上执行,以便在事情完成时发出信号。在 "scynchronous" 编程中取消一行,其中每个下一行仅在前一行代码完成时执行。

您的 "for" 循环否则只是 "sends everything" 到服务器并且在继续执行之前不等待完成。

但这里的主要问题是连接。但是您仍然应该如图所示修复其余部分。