【问题标题】:NodeJs is not creating a database in MongoDb? How to solve it?NodeJs 不是在 MongoDb 中创建数据库吗?如何解决?
【发布时间】:2020-01-19 23:12:16
【问题描述】:

以下代码是使用mongodb drive 的lambda 函数内的NodeJS 8.10。这是tutorial 的一部分。

它应该创建一个数据库testlambda2 并返回"inside function"。但我只得到"outside function" 并且没有创建数据库。似乎没有调用该函数。这是我可以确定连接是否已建立的唯一方法。我错过了什么?

"use strict";

const MongoClient = require('mongodb').MongoClient;

function createDb(){
    MongoClient.connect("mongodb://167.114.36.160:27017/testlambda2",
        { useNewUrlParser: true, useUnifiedTopology: true },
        function(err, db) {
            if (err) throw err;
            console.log("Database created!");
            db.close();
            return "inside function";
    });
    return "outside function";
}


module.exports.consumo_monofasico = async (event, context) => {

    var res= await createDb();

    const promise = {
        statusCode: 200,
        body: JSON.stringify(
            {
                message: 'Test mongo!',
                resultado:res
            },
            null,
            2
        ),
    };
    return promise
};

我在 cloudwatch 中没有错误,也没有错误日志

【问题讨论】:

    标签: node.js mongodb aws-lambda


    【解决方案1】:

    createDB 函数永远不会返回 "inside function",因为返回行 return "inside function"; 是返回 function (err, db)callback 函数而不是 createDB。另一方面,MongoClient.connectreturn "outside function"; 在“同一”时间执行,然后createDB 什么也不做,它只是返回"outside function" 字符串。你的 lambda 函数只需要 50 毫秒:| .

    但是为什么,MongoClient.connect 是一个 callback 函数,当 task - MongoClient.connect 完成时,callback 函数将被调用,在你的代码中你不关心这个,你只需返回"outside function" 字符串???

    我看到你使用await 关键字,我来宾你想等到已经连接到数据库,然后执行下一个运算符。如您所知(也许)await 仅对Promise 产生影响(要解释的很多事情,您可以在互联网上阅读更多内容)。

    如何解决你的问题,MongoClient.connect 没有Promise 版本(我是这么认为的),那你得把它转换成Promise函数版本,我想你需要等待的是DB的实例而不是一个字符串。最后,我的建议如下:

    
    "use strict";
    
    const MongoClient = require('mongodb').MongoClient;
    
    function createDb() {
      return new Promise((resolve, reject) => { // return createDb a promise
        MongoClient.connect("mongodb://167.114.36.160:27017/testlambda2",
          { useNewUrlParser: true, useUnifiedTopology: true },
          function (err, db) {
            if (err) {
              return reject(err);
            };
            console.log("Database created!");
            resolve(db); // like return :)
          });
      })
    }
    
    
    module.exports.consumo_monofasico = async (event, context) => {
      let result = {};
    
      try {
        var db = await createDb(); // now you can get a response what has been "pushed" in  `resolve`
        // TODO: Do some things with db instance
        // success response
        result = {
          statusCode: 200,
          body: JSON.stringify(
            {
              message: 'Test mongo!',
              resultado: "Connected!"
            },
            null,
            2
          ),
        };
        // close db connection
        db.close();
      } catch (err) { // err is a error what has been pushed in `reject` :|
        // error response
        result = {
          statusCode: 500, // http error code
          body: JSON.stringify(
            {
              message: 'Test mongo!',
              resultado: err
            },
            null,
            2
          ),
        };
      }
      return result;
    };
    

    【讨论】:

      【解决方案2】:

      看起来 Mongo 是一个 Promise,但是您没有将它标记为异步函数或返回 Promise 进行评估,因此它在完成 mongo Promise 之前返回外部函数片段,并在背景是因为 javascript 的异步特性是如何工作的。

      "use strict";
      
      const MongoClient = require('mongodb').MongoClient;
      
      module.exports.consumo_monofasico = async (event, context) => {
          try {
             var db = await MongoClient.connect("mongodb://167.114.36.160:27017/testlambda2", { useNewUrlParser: true, useUnifiedTopology: true });
             console.log("Database created!");
             db.close();
          } catch (err) {
             console.log('db error');
             throw err;
          }
          const promise = {
              statusCode: 200,
              body: JSON.stringify(
                  {
                      message: 'Test mongo!',
                      resultado:res
                  },
                  null,
                  2
              ),
          };
          return promise
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-12
        • 1970-01-01
        • 2015-03-06
        • 1970-01-01
        相关资源
        最近更新 更多