如何在nodeJs中的变量中保存连接结果

时间:2018-05-27 12:33:33

标签: javascript node.js express

我正在尝试在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函数之外获取数据库信息,以便将它们传递给路由模块?

1 个答案:

答案 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!')
  })
}
})();

此解决方案更具可读性。