gpt4 book ai didi

node.js - NodeJs 不是在 MongoDb 中创建数据库吗?怎么解决呢?

转载 作者:太空宇宙 更新时间:2023-11-03 23:54:26 27 4
gpt4 key购买 nike

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

它应该创建一个数据库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中没有错误,也没有错误日志 enter image description here

最佳答案

createDB 函数永远不会返回"inside function",因为返回行 return "inside function"; 是为 function (err, db)callback 函数返回,而不是为 createDB 返回。另一方面,MongoClient.connectreturn "outside function"; 在“同一”时间执行,那么 createDB 将不执行任何操作,它只是返回 “outside function” 字符串。你的 lambda 函数只需要 50ms :| .

但是为什么,MongoClient.connect是一个callback函数,callback函数会在task - MongoClient.connect完成时被调用,在你的代码中你不关心它,你只是返回“外部函数”字符串???

我看到你使用了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;
};

关于node.js - NodeJs 不是在 MongoDb 中创建数据库吗?怎么解决呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58002182/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com