Node.js Process.Exit()之后,Mongo数据库中没有写入数据

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 *

我正在编写node.js脚本,以便在MongoDB数据库中写入MySQL数据库中的一些数据。它不是一个web应用程序,而是一个本地脚本(mymysql和Mongo都是本地的)

问题是,当写入所有数据时,脚本不会终止。我必须用CTRL+C关闭它。但是我所有的数据都写在我的MongoDB数据库中

我在MongoDB中写入后调用的回调的末尾添加了一行“process.exit()”。应用程序终止,但未写入任何数据!我不明白为什么

下面是代码的相关部分

(...)
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数据集行数?