gpt4 book ai didi

mongodb - Node 和 Mongoose - 如果首次尝试连接时 mongod 未运行,则不会重新连接

转载 作者:行者123 更新时间:2023-12-03 03:09:28 26 4
gpt4 key购买 nike

使用 docker-composer 并且发现服务执行顺序存在问题。主要问题发生在我的 Express 应用尝试连接到 mongod 但尚未准备就绪时。

通过首先运行 nodejs 应用程序而不是 mongod 可以轻松重现该问题(手动强制这种情况)。

我的应用程序使用 mongoose 并尝试建立与 mongod 的连接。由于 mongod 未启动并运行,因此应用程序会引发错误

$ nodemon server/app.js 
24 Apr 21:42:05 - [nodemon] v1.7.0
24 Apr 21:42:05 - [nodemon] to restart at any time, enter `rs`
24 Apr 21:42:05 - [nodemon] watching: *.*
24 Apr 21:42:05 - [nodemon] starting `node server/app.js`
Listening on port 8000
disconnected
connection error: { [MongoError: connect ECONNREFUSED] name: 'MongoError', message: 'connect ECONNREFUSED' }

稍后启动 mongod 似乎可以重新连接

24 Apr 21:51:28 - [nodemon] v1.7.0
24 Apr 21:51:28 - [nodemon] to restart at any time, enter `rs`
24 Apr 21:51:28 - [nodemon] watching: *.*
24 Apr 21:51:28 - [nodemon] starting `node server/app.js`
Listening on port 8000
disconnected
connection error: { [MongoError: connect ECONNREFUSED] name: 'MongoError', message: 'connect ECONNREFUSED' }
connected
reconnected

尽管如此,需要访问 mongo 的操作将无法完成...两个错误都不会显示

enter image description here

这是使用 mongoose 连接到 mongo 的代码:

// Starting mongo
mongoose.connect(config.database, {
server:{
auto_reconnect:true,
reconnectTries: 10,
reconnectInterval: 5000,
}
});

// Listening for connection
var mongo = {};
var db = mongoose.connection;
db.on('connected', console.error.bind(console, 'connected'));
db.on('error', console.error.bind(console, 'connection error:'));
db.on('close', console.error.bind(console, 'connection close.'));
db.once('open', function() {
console.log("We are alive");
});
db.on('reconnected', function(){
console.error('reconnected');
});
db.on('disconnected', console.error.bind(console, 'disconnected'));

这是尝试从 mongo 获取数据但失败的路由。

router.post('/auth', function(req, res){

User.findOne({name: req.body.name})
.then(function(user){

if(!user)
{
res.status(401).send({ success: false, message: 'Authentication failed. User not found.' });
}
...

在 mongo 准备就绪之前,如何从正在运行的 Nodejs 中恢复?

最佳答案

就我而言,我仅为 Mongoose 连接方法创建了单独的函数:

const connect = () => {
mongoose.connect('mongodb://localhost:27017/myapp', {
useNewUrlParser: true,
reconnectTries: Number.MAX_VALUE,
reconnectInterval: 500,
poolSize: 10,
});
};

我在同一开始调用它。我还为 error 事件添加了事件处理程序:

mongoose.connection.on('error', (e) => {
console.log('[MongoDB] Something went super wrong!', e);
setTimeout(() => {
connect();
}, 10000);
});

如果 mongoose 由于 MongoDB 未运行而无法连接,则会触发错误事件处理程序,并且 setTimeout 安排“自定义”重新连接。

希望有帮助。

关于mongodb - Node 和 Mongoose - 如果首次尝试连接时 mongod 未运行,则不会重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36827587/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com