【问题标题】:Mongoose callback not working using ForeverMongoose 回调无法使用 Forever
【发布时间】:2015-09-30 01:45:39
【问题描述】:

我正在尝试使用 Forever 运行一个后台进程,该进程每小时将来自外部服务的数据添加到我的 mongodb 数据库中(我是 node 新手,不知道如何执行此操作)。我正在使用带有 Express 的 Node 并使用

运行永远的任务
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() 回调不起作用,放置在 create 回调中的 console.logs 没有在日志中显示任何内容。 Forever 不适用于猫鼬?你有什么想法吗?

【问题讨论】:

    标签: node.js mongodb express mongoose forever


    【解决方案1】:

    好吧,事情就是这样。您从未将猫鼬适配器“连接”到数据库。只需添加:

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

    在您尝试做任何其他事情之前,请先到达顶部附近。它不一定按这个顺序“连接”,但猫鼬方法会解决这个问题。 “异步编程”,请继续阅读。

    此外,您不应该像这样循环,因为您没有等待“回调”(它不是闭包,而是回调)来完成或以其他方式“限制”连接,这可能会导致问题。

    改用"async" 之类的东西来处理这个问题。在此示例中,.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
    });
    

    请记住,“异步”代码需要在“回调”或“承诺”上执行,以便在事情完成时发出信号。在“同步”编程中取消行,其中下一行仅在前几行代码完成时执行。

    否则,您的“for”循环只会“将所有内容发送”到服务器,并且在继续执行之前不会等待完成。

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

    【讨论】:

    • 哦,你是对的,我在我的 app.js 文件中连接到 mongodb,但这个脚本与 app.js 文件无关。似乎现在正在工作。你是对的,我的意思是回调对不起,我总是混淆这两个词!我知道我没有同步创建文档,但在这种情况下我不介意,似乎工作正常。非常感谢!
    • @miquelarranz 是的。连接app.js 或其他“主模块代码”是长时间运行应用程序的标准。但是当然这个“脚本”是独立的,所以你需要在那里做。这里的另一个建议是您真正需要遵循的,以免您将来遇到问题。
    • 是的,感谢您的建议 :) 我正在测试知道脚本,似乎 setTimeout 不起作用,脚本不断添加新文档。也许它与一切都是异步工作的事实有关?有什么想法吗?
    • 没关系,我解决了,错误地使用了 eachLimit 函数。非常感谢您的帮助。
    • @miquelarranz 如果您还有更多问题,请在此处发布新问题,因为我相信有人会回答。我已经在这里给你建议,你的插入需要“等待”直到完成,然后你的脚本的其余部分继续。我将在这里提供的唯一“提示”是,这可能是“cron”样式处理的工作,而不是您目前正在尝试做的工作。
    猜你喜欢
    • 2013-10-21
    • 2013-05-11
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2014-11-19
    • 2015-12-25
    相关资源
    最近更新 更多