В коде много плохих практик, я попытаюсь рассказать о них.
- Ваш файл
db.js
запускает асинхронное действие в тот момент, когда оно требуется.
- Вы не возвращаете Promise из файла
db.js
, поэтому ваш файл server.js
начинает выполнять код, не зная, было ли соединение с БД выполнено / ожидает или отклонено
- Вы экспортируете метод после выполнения функции, это приводит ко многим странным и неожиданным побочным эффектам. Лучше всего определять все ваши экспорты на верхнем уровне файла.
Самый простой способ решить вашу проблему:
server.js :
const connectDB = require('./db')
connectDB().then((db) => {
app.get("/test", (req, res) => {
console.log(db.getPostAll())
})
app.listen(...); // lift the server ONLY when the db is connected
});
db.js :
module.exports = function connectDB() {
return MongoClient.connect(uri, { useNewUrlParser: true })
.then(function (db) {
console.log("Connected")
var dbo = db.db('test')
return {
getPostAll() {
return dbo.collection('posts').find({}).toArray()
}
}
})
}
В файле db.js
я экспортирую функцию, которая возвращает обещание. Таким образом, я могу сказать, когда соединение установлено (после разрешения обещания), он возвращает объект со всеми необходимыми вам методами db ( getPostAll
).
В файле server.js
я ожидаю установления асинхронного соединения перед тем, как поднять приложение, поэтому я знаю, что мое приложение находится в состоянии готовности, когда оно обслуживается, и у меня есть db
методы легко доступны для моего приложения.