代码之家  ›  专栏  ›  技术社区  ›  Hamza Haddad

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

  •  0
  • Hamza Haddad  · 技术社区  · 6 年前

    我试图在常量中保存一个函数返回,因为我可以在函数之外使用信息。为了进一步说明我的问题,这里有一段代码。

    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 回复  |  直到 6 年前
        1
  •  1
  •   Bilal Alam    6 年前

    首先,在平台上复制粘贴代码时要小心,如果代码中有密码,那么infact 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。

    异步等待 如果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!')
      })
    }
    })();
    

    这个解决方案更易读。