Mongoose 脚本无法正确终止

Posted

技术标签:

【中文标题】Mongoose 脚本无法正确终止【英文标题】:Mongoose script doesn't terminate properly 【发布时间】:2016-03-09 23:05:03 【问题描述】:

我有一个 node.js 脚本,我想定期运行它使用 mongoose 写入 mongodb。它连接到 mongodb,写入和断开连接。问题是脚本有时似乎挂起。我必须手动终止脚本(ctrl+C)。

mongoose.connect(MONGODB_URL);

var db = mongoose.connection;
db.on('error', function(err) 
    console.log(err);
);
db.on('open', function() 
    console.log('opened');
);
db.on('close', function() 
    console.log('closed');
);

Model.update(....., function(err) 
    if (err) throw err;
    mongoose.disconnect();
);

一切似乎都很好。该脚本打印openedclosed 并正确更新数据库,但之后不会终止。在完成对数据库的所有更新后,我还在标注内部断开连接,因此不应该有任何挂起的查询会阻止脚本终止。

这里提出了类似的问题:Properly close mongoose's connection once you're done 但似乎没有任何真正的解决方案。

编辑: 我可以通过在末尾添加process.exit() 来终止它,但事实并非如此。

【问题讨论】:

当我尝试它时退出正常,所以问题可能在您的代码中的其他地方。 【参考方案1】:

mongoose.connection.close() 为我工作,但您需要确保在调用它之前完成所有数据库操作。

【讨论】:

【参考方案2】:

这是访问 Mongo 数据库的示例脚本:

const  Model  = require("../models");
const mongoose = require("mongoose");

async function run() 

    let c = `mongodb://$process.env.DBUSER`;
    c += `:$process.env.DBPASS`;
    c += `@$process.env.DBHOST`;
    c += `:$process.env.DBPORT`;
    c += `/$process.env.DBNAME`;
    await mongoose.connect(
      c,
       useNewUrlParser: true, useUnifiedTopology: true ,
      () => 
    );
    const db = mongoose.connection;
    db.on("error", console.error.bind(console, "MongoDB connection error:"));

    const instances = await Model.find();
    for (const i of instances) 
      console.log(i.title);
    

    mongoose.connection.close();



run().catch((error) => console.log(error.stack));

如果它保存在像 script.js 这样的文件中,只需运行 node script.js

【讨论】:

以上是关于Mongoose 脚本无法正确终止的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB + Mongoose:独特:真正无法正常工作[重复]

Mongoose 更新或插入许多文档

如何正确处理猫鼬模式迁移?

如何正确处理猫鼬模式迁移?

如何正确处理猫鼬模式迁移?

Mongoose.js 条件填充