mongoDB collection.findOne() returns 未定义
mongoDB collection.findOne() returns undefined
我在用于获取用户的文件中有一个函数,该函数中的 console.log() 有效,但是当从另一个文件使用它时,它 returns 未定义。
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()
中的回调函数。
在您尝试使用的情况下,我建议您摆脱回调并简单地将对 getUser()
的调用包装在 try/catch 中,这样您就不会丢失错误处理,像这样:
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()
的调用中将其传递给 findOne()
而不是在那里定义它。
如果您想使用 await
调用它,您需要使 getUser return 成为一个承诺。从回调函数返回一个值不会 return 对调用者有任何影响。
如今,findOne
return 是您不传递回调的承诺。所以你可以简单地做这样的事情。
exports.getUser = function(_id) {
return collection.findOne({
_id
});
}
OP 尝试将该函数用作异步,但它必须以这种方式进行限定,并且必须 return 一个承诺...
exports.getUser = async function(_id) {
return new Promise((resolve, reject) => {
collection.findOne({_id: _id}, (err, data) => {
err ? reject(err) : resolve(data)
})
})
}
我在用于获取用户的文件中有一个函数,该函数中的 console.log() 有效,但是当从另一个文件使用它时,它 returns 未定义。
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()
中的回调函数。
在您尝试使用的情况下,我建议您摆脱回调并简单地将对 getUser()
的调用包装在 try/catch 中,这样您就不会丢失错误处理,像这样:
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()
的调用中将其传递给 findOne()
而不是在那里定义它。
如果您想使用 await
调用它,您需要使 getUser return 成为一个承诺。从回调函数返回一个值不会 return 对调用者有任何影响。
如今,findOne
return 是您不传递回调的承诺。所以你可以简单地做这样的事情。
exports.getUser = function(_id) {
return collection.findOne({
_id
});
}
OP 尝试将该函数用作异步,但它必须以这种方式进行限定,并且必须 return 一个承诺...
exports.getUser = async function(_id) {
return new Promise((resolve, reject) => {
collection.findOne({_id: _id}, (err, data) => {
err ? reject(err) : resolve(data)
})
})
}