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

时间:2019-05-14 15:27:15

标签: javascript mongodb express mongoose

我正在使用MongoDB,Node和Express开发Angular 7应用程序。如果在连接到MongoDB(使用mongod命令)之前启动我的Express应用程序(使用npm start命令),则Express应用程序首先会引发错误,因为它无法与MongoDB建立连接。一旦MongoDB启动并运行,Express应用程序会通知我MongoDB现在已连接到端口27017。但是,我通过Angular应用程序执行的任何http发布请求都会导致Express返回200状态代码(这告诉我一切正常),但是MongoDB由于http发布请求而无法创建文档。当我执行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会话后重新启动我的express应用程序时,此问题已解决,但是我并不总是拥有检查日志的功能以及该应用程序在生产中时创建文档的能力。赞赏一些指导。

1 个答案:

答案 0 :(得分:1)

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

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

在那之后,您可以考虑编写所有返回promise的init函数。这样,您可以将其链接起来,一切就很清楚了。这是一个实例,其中先创建兔子,然后创建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))