gpt4 book ai didi

javascript - 如何确定 Express 应用程序与 MongoDB 的连接是否真正打开?

转载 作者:行者123 更新时间:2023-12-02 23:39:44 26 4
gpt4 key购买 nike

我正在使用 MongoDB、Node 和 Express 开发 Angular 7 应用程序。如果我在连接到 MongoDB(使用 mongod 命令)之前启动 Express 应用程序(使用 npm start 命令),Express 应用程序首先会抛出错误,因为它无法与 MongoDB 建立连接。 MongoDB 启动并运行后,Express 应用程序会通知我 MongoDB 现在已在端口 27017 处连接。但是,我通过 Angular 应用程序执行的任何 http post 请求都会导致 Express 返回 200 状态代码(这告诉我一切正常),但是 MongoDB 由于 http post 请求而无法创建文档。当我执行 post http 请求时,如何确保 MongoDB 不仅已连接,而且该连接可以成功创建新文档?我在某处读到,MongoDB 保存/创建文档的能力要求它有一个开放的连接。在这方面,拥有开放连接和在端口 27017 连接 MongoDB 有什么区别?

这是我在 Express app.js 文件中用于连接到 MongoDB 的代码:

var express = require('express');
var mongoose = require('mongoose');

var app = express();

var mongoose_uri = process.env.MONGOOSE_URI || "mongodb://abc:abc123@localhost:27017/databank?authSource=admin";
mongoose.set('debug', true);
mongoose.connect(mongoose_uri);

mongoose.connection.on('connected', ()=>{
console.log('MongoDB connected at port 27017');
});

//Not sure if the mongoose.connection.once is necessary to have, considering I already have mongoose.connection.on above.

mongoose.connection.once('open', ()=>{
console.log('MongoDB connection now open');
})
//MongoDB connection error
mongoose.connection.on('error', (err)=>{
console.log(err);
})

这是 npm 日志,首先显示连接错误,然后连接成功,然后是几个状态代码为 200 的 Post 请求,但没有任何内容保存到 MongoDB 集合中。

[nodemon] 1.19.0
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node ./bin/www`
API Gateway listening at http://localhost:8085/api
Web Server listening at http://localhost:8085/
{ Error: connect ECONNREFUSED 127.0.0.1:27017
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1097:14)
name: 'MongoError',
message: 'connect ECONNREFUSED 127.0.0.1:27017' }
MongoDB connected at port 27017
POST /api/contactus 200 335.509 ms - 18
POST /api/contactus 200 9.082 ms - 18
POST /api/contactus 200 3.916 ms - 18
POST /api/contactus 200 6.268 ms - 18
POST /api/contactus 200 61.876 ms - 18

当然,当我在事件的 mongoDB session 后重新启动 Express 应用程序时,这个问题得到了解决,但我并不总是有机会检查日志以及应用程序在生产中创建文档的能力。感谢一些指导。

最佳答案

你必须先连接到mongo,然后初始化express。

mongoose.connection.on('connected', ()=>{
console.log('MongoDB connected at port 27017');
app = express();
});
//once open event is not necessary

之后,您可以考虑编写所有返回 promise 的初始化函数。这样你就可以把它链接起来,一切就都清楚了。这是一个示例,先初始化rabbit,然后初始化mongo,然后初始化express。

initRabbit()
.then(initMongo)
.then(initExpress)
.catch(e => {
error({error:"boot", cause: e})
process.exit(-1)
})

const initMongo = () => new Promise(resolve => mongoose.connection.on('connected', resolve))

关于javascript - 如何确定 Express 应用程序与 MongoDB 的连接是否真正打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56133924/

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