Как определить, действительно ли соединение приложения Express с MongoDB действительно открыто? - PullRequest
0 голосов
/ 14 мая 2019

Я работаю над приложением Angular 7 с MongoDB, Node и Express. Если я запускаю свое приложение Express (с помощью команды npm start) перед подключением к MongoDB (с помощью команды mongod), приложение Express сначала выдает ошибку, поскольку не может установить соединение с MongoDB. Когда MongoDB запущен и запущен, приложение Express сообщает мне, что MongoDB теперь подключен к порту 27017. Однако любые запросы HTTP post, которые я выполняю через мое приложение Angular, заставляют Express возвращать код состояния 200 (который говорит мне, что все в порядке), но MongoDB не может создать документ в результате запроса http post. Как мне убедиться, что MongoDB не только подключен, но и что соединение может успешно создать новый документ, когда я выполняю запрос HTTP после публикации? Я где-то читал, что способность MongoDB сохранять / создавать документ требует наличия открытого соединения. В этом отношении, в чем разница между открытым соединением и подключением MongoDB через порт 27017?

Вот код, который я использую в файле 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, показывающий сначала ошибку соединения, затем успешное соединение, затем несколько запросов Post с кодом состояния 200, но в коллекцию 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, но у меня не всегда будет такая роскошь, как проверка журналов и способность приложения создавать документы во время работы. Цените некоторые указания.

1 Ответ

1 голос
/ 14 мая 2019

Сначала необходимо подключиться к mongo, а затем инициализировать экспресс.

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

После этого вы можете подумать о написании функций инициализации, которые возвращают все обещания.Таким образом, вы можете связать это, и все ясно.Вот пример, где зарождается кролик, затем монго, а затем экспресс.

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...