Node.js NodeJs没有在MongoDb中创建数据库?如何解决?
以下代码是lambda函数中使用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
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