Node.js Process.Exit()之后,Mongo数据库中没有写入数据
我正在编写node.js脚本,以便在MongoDB数据库中写入MySQL数据库中的一些数据。它不是一个web应用程序,而是一个本地脚本(mymysql和Mongo都是本地的) 问题是,当写入所有数据时,脚本不会终止。我必须用CTRL+C关闭它。但是我所有的数据都写在我的MongoDB数据库中 我在MongoDB中写入后调用的回调的末尾添加了一行“process.exit()”。应用程序终止,但未写入任何数据!我不明白为什么 下面是代码的相关部分Node.js Process.Exit()之后,Mongo数据库中没有写入数据,node.js,mongodb,asynchronous,mongoose,Node.js,Mongodb,Asynchronous,Mongoose,我正在编写node.js脚本,以便在MongoDB数据库中写入MySQL数据库中的一些数据。它不是一个web应用程序,而是一个本地脚本(mymysql和Mongo都是本地的) 问题是,当写入所有数据时,脚本不会终止。我必须用CTRL+C关闭它。但是我所有的数据都写在我的MongoDB数据库中 我在MongoDB中写入后调用的回调的末尾添加了一行“process.exit()”。应用程序终止,但未写入任何数据!我不明白为什么 下面是代码的相关部分 (...) var req = "SELECT *
(...)
var req = "SELECT * FROM geometry";
// "connection" is a MySQL connection
connection.query(req, function(err, rows, fields) {
console.log("number of lines :" + rows.length);
connection.end();
if (err) {
throw err;
}
// "Entry" is my model
for (var i = 0; i < rows.length; i++) {
Entry.create({
"code" : rows[i].code,
"name" : rows[i].name,
"coords" : rows[i].coords,
"type" : rows[i].type
}, function(err, doc){
if (err) {
throw (err);
}
});
}
console.log("end");
process.exit(); // no data written ! why ?
});
(…)
var req=“从几何图形中选择*”;
//“连接”是一个MySQL连接
查询(请求、函数(错误、行、字段){
log(“行数:+行数.长度”);
连接。结束();
如果(错误){
犯错误;
}
//“进入”是我的模式
对于(变量i=0;i
你能帮我吗?
提前感谢。问题是您过早终止进程。您没有等待
mongoose
将您的任何文档发送到MongoDB。下面是一些如何正确操作的示例
N.B.请先了解为什么没有写入数据,然后阅读我的答案,了解如何处理
使用承诺和模块 首先,当模块(或任何其他基于承诺的控制流模块,例如)时,我们应该要求
when=require('when');
然后我们可以使用它来简化代码:
promises = rows.map(function(row) {
return Entry.create(row);
})
when.all(promises).otherwise(console.error).ensure(function() {
process.exit()
})
或者在.map时使用:
when.map(rows, function(row) {
return Entry.create(row);
}).otherwise(console.error).ensure(function() {
process.exit()
})
N.B.此溶液可用于猫鼬染色
使用模块
async.js
是node.js基于回调的控制流模块:
async = require('async');
但它几乎和承诺一样强大:
async.map(roes, function(row, next) {
Entry.create(row, next);
}, function(err){
if (err) throw (err);
process.exit();
});
使用纯JavaScript
但我们可以使用基于JavaScript的纯回调实现相同的结果:
var pending = 0;
rows.forEach(function(row) {
pending++;
Entry.create(row, function(err) {
if (err) throw (err);
if (--pending === 0) process.exit();
});
});
关于猫鼬的注释
Bu默认mongoose使用,所以我只需调用
Entry.create(row);
知道mongoose将删除行
中不在条目
模式中的任何属性
关于异步代码和控制流模块的说明
控制流模块(promises、async.js等)帮助您处理异步代码,但如果您不熟悉node.js和异步编程,我建议您从纯js方法开始,以便更好地理解node.js。然后采用一些控制流解决方案是安全的
您还应该注意到,承诺为异步代码提供了一个巨大的抽象层,其中包含大量语法糖分,而基于回调的模块(如async.js)只提供了一小部分
因此,在我看来,掌握node.js的最佳方法如下:
purejs->基于回调的模块(async.JS)->承诺
最新的node.js 0.11.x(带有--harmony
标志)也提供了支持,提供了另一种处理异步代码的方法。您似乎不习惯异步思考。试着阅读这个问题和答案,看看你是否理解你是如何在你的案例中犯同样的错误:谢谢你的回答,你的链接打开了我大脑中的一盏灯:)好的,我明白了。因此,我将尝试纯JS方法。我想我必须跟踪已创建用户的数量,并在Create()回调中发送process.exit(),只要该数量等于我的MySQL数据集行数?