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" 到服务器并且在继续执行之前不等待完成。
但这里的主要问题是连接。但是您仍然应该如图所示修复其余部分。
我正在尝试 运行 使用 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" 到服务器并且在继续执行之前不等待完成。
但这里的主要问题是连接。但是您仍然应该如图所示修复其余部分。