Mongoose脚本没有正确终止

时间:2015-12-04 21:52:03

标签: node.js mongodb mongoose

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

TextureLookAndFeel.setTheme("Textile", "", "");

一切似乎都很好。该脚本打印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(); }); opened并正确更新数据库,但在此之后不会终止。在完成对数据库的所有更新后,我也会在callout内部断开连接,因此不应该有任何会阻止脚本终止的待处理查询。

此处也提出了类似的问题:Properly close mongoose's connection once you're done 但它看起来没有任何真正的解决方案。

编辑:
我可以通过在最后添加closed来终止它,但事实并非如此。

3 个答案:

答案 0 :(得分:0)

public class UsersController : Controller { public async Task Index() { var allUsers = await db.Users.ToListAsync(); // set all roles to a variable, so that we don't hit the database for every user iteration // is this true? var allRoles = await db.Roles.ToListAsync(); var users = allUsers.Select(u => new UsersViewModel {User = u, Roles = String.Join(",", allRoles.Where(role => role.Users.Any(user => user.UserId == u.Id)).Select(r => r.Name))}).ToList(); return View(users); } }对我有用,但您需要确保所有数据库操作都已完成,然后才能调用它。

答案 1 :(得分:0)

所以我发现了问题所在。我每15分钟运行一次这个脚本作为一个cron工作。它运行在运行我们的API的同一台服务器上。还有一些其他的东西每15分钟就会运行一次,这会使API受到请求的影响。不知何故,当连接和断开mongodb时,这会导致脚本出现问题。

我通过在不同时间运行cron作业解决了这个问题。我不知道是否有任何人可以做些什么来使mongodb司机更健壮......

答案 2 :(得分:0)

这是访问 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