Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js NodeJs没有在MongoDb中创建数据库?如何解决?_Node.js_Mongodb_Aws Lambda - Fatal编程技术网

Node.js NodeJs没有在MongoDb中创建数据库?如何解决?

Node.js NodeJs没有在MongoDb中创建数据库?如何解决?,node.js,mongodb,aws-lambda,Node.js,Mongodb,Aws Lambda,以下代码是lambda函数中使用mongodb驱动器的NodeJS 8.10。这是其中的一部分 它应该创建一个数据库testlambda2,并返回“内部函数”。但是我只得到了“外部函数”,并且数据库没有被创建。似乎函数没有被调用。这是我唯一能确定连接是否建立的方法。我错过了什么 "use strict"; const MongoClient = require('mongodb').MongoClient; function createDb(){ MongoClient.conne

以下代码是lambda函数中使用
mongodb驱动器的NodeJS 8.10。这是其中的一部分

它应该创建一个数据库
testlambda2
,并返回
“内部函数”
。但是我只得到了
“外部函数”
,并且数据库没有被创建。似乎函数没有被调用。这是我唯一能确定连接是否建立的方法。我错过了什么

"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中没有错误,也没有错误日志

根据我运行的测试,MongoDB您的连接可能被服务器拒绝。尝试更改MongoDB服务器配置上的端口或设置“打开”外部访问(通过将IP 0.0.0/0列入白名单,例如,它允许任何IP地址建立到服务器的连接)


我希望你觉得这个答案在某种程度上有用

看起来Mongo是一个承诺,但是您没有将其标记为异步函数,也没有返回用于求值的承诺,因此它在完成Mongo承诺之前返回外部函数,并且由于javascript的异步特性,它在后台运行Mongo内容

"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
};

createDB
函数永远不会返回
“内部函数”
,因为返回行
返回“内部函数”
函数(err,db)
回调
函数的返回值,而不是
createDB
。另一端,
MongoClient.connect
返回“外部函数”在“同一”时间执行,然后
createDB
将不做任何事情,它只返回
外部函数“
字符串。你的lambda函数只需要50毫秒:|

但是为什么,
MongoClient.connect
是一个
回调
函数,当任务-MongoClient.connect完成时,
回调
函数将被调用,在你的代码中你不在乎,你只需返回
外部函数“
字符串

我看到您使用了
wait
关键字,我想让您等到与DB的连接已经建立,然后执行下一个操作符。正如您所知(可能)
等待
仅具有
承诺的效果
(对于许多需要解释的内容,您可以在互联网上阅读更多)

如何解决您的问题,
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;
};

嗨,阮,它已经被列入白名单了。这就是我在
/etc/mongodb.conf
bind_ip=0.0.0.0127.0.0.1