我有一个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
来终止它,但事实并非如此。
答案 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
。