问题描述
我在用于获取用户的文件中有一个函数,该函数中的console.log()可以正常工作,但是从另一个文件中使用它时,它会返回未定义状态。
const db = client.db('TestDatabase');
const collection = db.collection('users');
exports.getUser = function(_id) {
collection.findOne({
_id: _id
},(err,data) => {
if (err) {
console.log(err);
return;
}
//console.log(data); // Logs the proper data.
return data; // Return data?
});
}
使用以下文件进行即时通讯:
const database = require('./db.js');
let user = database.getUser(_id);
console.log(user); // This logs "undefined"
解决方法
尝试通过指定集合名称;
db.getCollection("<COLLECTION_NAME").find({})....
,
我对使用回调和 await
表示怀疑。如果您以后要更改响应的处理方式,则无需使用getUser()
中的回调函数。
在您尝试使用的情况下,我建议您摆脱回调,而只需在try / catch中将对getUser()
的调用包装起来,这样就不会丢失错误处理,就像这样:
function findOne(query) {
return Promise.resolve(query)
}
function getUser(_id) {
return findOne({ _id })
}
async function main() {
try {
let user = await getUser( 'myId' )
console.log(user)
} catch (error) {
console.error(error)
}
}
main()
另一种选择是将回调传递到您的getUser()
函数中,并将其传递到您对findOne()
的调用中,而不是在其中定义它。
如果要使用await
进行调用,则需要使getUser返回一个Promise。从回调函数返回值不会向调用方返回任何内容。
这些天来,findOne
在您不传递回调时返回一个承诺。因此,您只需执行以下操作即可。
exports.getUser = function(_id) {
return collection.findOne({
_id
});
}
,
OP尝试将函数用作异步,但是必须以这种方式进行限定,并且必须返回一个promise ...
exports.getUser = async function(_id) {
return new Promise((resolve,reject) => {
collection.findOne({_id: _id},(err,data) => {
err ? reject(err) : resolve(data)
})
})
}