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

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

最佳答案

首先在平台上复制粘贴代码时要小心,如果代码中有密码,请删除密码,事实上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)
    }
});

现在 console.log 只会在 mongoose.connect 完成后执行

异步等待 如果你的nodejs >= 7.10.1,你的nodejs支持Async wait,你可以检查 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!')
  })
}
})();

这个解决方案更具可读性。

关于javascript - 如何将连接结果保存在nodeJs中的变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50552190/

相关文章:

node.js - Mongo gridfs-stream

javascript - NodeJs 中的过期 key

javascript - 使用 setTimeout 时 meteor 集合不保存

javascript - 在 jquery 中添加类工作正常,但删除类不起作用

mysql - 如何使用nodeJs在Lambda函数中使用mysq事务提交回滚

javascript - 使用 Node.js 下载大文件的时间复杂度应该较低

javascript - knex.js 管道表达

c# - 该表有一列带有复选框,需要选择该行并将行发送到另一个表。

javascript - 无法通过在 javascript 中识别对象的父 ID 将对象插入父数组

node.js - Azure 函数 - 从磁盘读取文件并返回 HTML 页面