我有一个名为extrafunctions.js的文件,该文件导出要由app.js运行的函数。这些功能之一包括MongoDB查询findOne。问题在于该函数在查询完成之前返回一个值,因此app.js不会获取所需的数据,而是“未定义”。
我在某种程度上尝试了Promises,但没有任何东西可以工作。
app.js:
[ 5b579074dc1eac0014276442, 5b574e03dc1eac0014276418 ]
extraFunctions.js:
const extraFunctions = require("./extraFunctions");
app.get('/api/login', (req, res) => {
res.end(extraFunctions.login());
});
固定版本
与接受的评论相同,但必须将function login ()
{
client.connect(err => {
var collection = client.db("site").collection("test");
collection.findOne({}, (err, result) => {
if (err) throw err;
console.log(result);
return result;
});
client.close();
});
}
module.exports.login = login;
更改为res(result)
答案 0 :(得分:0)
您需要使用promise
或async-await
,以下是Promise实现的示例:
应用js
const extraFunctions = require("./extraFunctions");
app.get('/api/login', (req, res) => {
extraFunctions.login().then(result =>{
res.end(result);
})
});
extraFunctions.js
function login() {
return new Promise((res, rej) => {
client.connect(err => {
if(err){
rej(err)
}
var collection = client.db("site").collection("test");
collection.findOne({}, (err, result) => {
if (err) rej(err);
console.log(result);
res(result)
});
client.close();
});
})
}
module.exports.login = login;
答案 1 :(得分:0)
如果您使用本机mongodb
连接器,则它提供Promise
支持。您可以这样使用:
// connection is a promise
const connection = MongoClient.connect(url, { useNewUrlParser: true });
// async function
async function login () {
let result;
try {
const client = await connection;
var collection = client.db("site").collection("test");
try {
result = await collection.findOne({})
} catch (err) {
throw err;
}
client.close();
} catch (e) {
throw e;
}
return result;
}
module.exports.login = login;
在您的路线上:
const extraFunctions = require("./extraFunctions");
app.get('/api/login', async (req, res, next) => {
try {
const result = await extraFunctions.login();
res.end(result);
} catch (e) {
next(e);
}
});