我有两个文件
server.js
(function () {
var x = modules.dbFind('7');
setTimeout(function() {
console.log(x);
}, 100);
})();
和我的modules.js
var dbFind = (id) => {
console.log("dbFIND function in use!");
MongoClient.connect(url, function(err, db) {
if (err) throw err;
db.collection("users").findOne({id:id}, function(err, result) {
if (err) throw err;
console.log(JSON.stringify(result));
return(result);
db.close();
});
});
};
我想将RESULT从模块传递到服务器文件并在那里读取,但x = undefined。 modules.js中的结果 - console.log(result)显示所有内容。
我知道问题是在结果到达之前读取X - 但我已经尝试了几天而且我不知道如何解决它。
答案 0 :(得分:1)
更改如下。 如果你使用promise / then,则不需要等待setTimeout。
server.js
(async function () {
modules.dbFind('7')
.then((result)=> {
console.log(result);
});
})();
modules.js
function dbFind(id) {
return new Promise((resolve, reject)=> {
console.log("dbFIND function in use!");
MongoClient.connect(url, function(err, db) {
if (err) reject(err);
db.collection("users").findOne({id:id}, function(err, result) {
if (err) reject(err);
console.log(JSON.stringify(result));
resolve(result);
db.close();
});
});
});
}
答案 1 :(得分:0)
由于这是标记的承诺,你可以使用async / await和MongoClient包含promises的事实。否则,这是this question的重复:
const dbFind = async (id) => {
console.log("dbFIND function in use!");
const db = await MongoClient.connect(url)); // no callback = return promise
try {
let user = db.collection("users").findOne({id}); // shorthand {id:id}
return user;
} finally {
db.close();
}
}
这可以让你这样做:
(async () =>
let found = await modules.dbFind('7');
console.log(found);
})()
另请注意,Mongo连接应该是持久性的,并且每个应用程序打开一次,而不是每个请求。