所以我有两个文件,server.js
和db.js
现在,这是我遇到的代码:
server.js :
var DB = require('./db')
app.get("/test", (req, res) => {
console.log(DB.getPostAll())
})
db.js :
MongoClient.connect(uri, { useNewUrlParser: true })
.then(function (db) {
console.log("Connected")
var dbo = db.db('test')
module.exports.getPostAll = function getPostAll() {
return (
dbo.collection('posts').find({}).toArray(function (err, res) {
if (err) throw err;
else return res
})
)
}
})
.catch(function (err) {
})
很抱歉这个愚蠢的问题。但是,有人可以说我在做什么错吗?
我正在尝试使用两个收益。在此之前,我尝试使用变量代替db.js的getPostAll
中的返回值。但它也会返回undefined
。
答案 0 :(得分:2)
代码中有很多不良做法,我将尝试涵盖一些。
db.js
文件在需要时立即触发异步操作。db.js
文件中返回Promise,因此您的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
文件中,我正在等待建立异步连接,然后再提起应用程序,这样我就知道我的应用程序在投放时处于就绪状态,并且{ {1}}种方法可立即用于我的应用。
答案 1 :(得分:1)
由于您的承诺尚未兑现,您将变得不确定。尝试使用异步功能,然后等待您的数据库操作完成。参见working with async funtions。您还可以尝试将mongoose对象建模用作mongodb客户端。