我正在尝试在const中保存函数返回,因为我可以在函数之外使用信息。为了说明我的问题,这里有一段代码。
const express = require('express')
const app = express()
var routes = require('./routes/routes');
var bodyParser = require('body-parser')
var MongoClient = require('mongodb').MongoClient;
const dbb = MongoClient.connect("mongodb://user:tpassword@ds137600.mlab.com:37600/tasksdb", { useNewUrlParser: true }, function (err, db) {
if (!err) {
console.log(db.db().databaseName);
}
else {
console.log(err)
}
});
app.use('/', routes);
app.use(bodyParser.urlencoded({ extended: true }));
app.listen(3000, function () {
console.log("second", dbb);
console.log('Example app listening on port 3000!')
})
这是我在终端获得的内容:
second undefined
Example app listening on port 3000!
tasksdb
如何在MongoClient.connect
函数之外获取数据库信息,以便将它们传递给路由模块?
答案 0 :(得分:1)
首先在平台上复制粘贴代码时要小心,如果代码中有任何密码,则删除密码,实际上mongoURL应该在.env文件中,而不是在主js中。
MongoClient.connect()是一个异步调用,因此当行
时console.log("second", dbb);
执行,MongoClient.connect()仍在等待
要使其同步,有多种解决方案:
使用回电
const dbb = MongoClient.connect("mongodb://user:tpassword@ds137600.mlab.com:37600/tasksdb", { useNewUrlParser: true }, function (err, db) {
if (!err) {
console.log(db.db().databaseName);
app.listen(3000, function () {
console.log("second", dbb);
console.log('Example app listening on port 3000!')
})
}
else {
console.log(err)
}
});
现在只有在mongoose.connect完成后才会执行console.log
ASYNC AWAIT 如果你有nodejs> = 7.10.1,你的nodejs支持异步等待,你可以检查here
(async function init() {
const dbb = await MongoClient.connect("mongodb://user:tpassword@ds137600.mlab.com:37600/tasksdb", {
useNewUrlParser: true
});
if(dbb){
app.use('/', routes);
app.use(bodyParser.urlencoded({
extended: true
}));
app.listen(3000, function() {
console.log("second", dbb);
console.log('Example app listening on port 3000!')
})
}
})();
此解决方案更具可读性。