[英]mongoDB collection.findOne() returns undefined
我在用於獲取用戶的文件中有一個函數,該函數中的 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
持懷疑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()
調用中傳遞它,而不是在那里定義它。
如果你想使用await
調用它,你需要讓 getUser 返回一個 promise。 從回調函數返回值不會向調用者返回任何內容。
現在,當您不傳遞回調時, findOne
返回一個承諾。 所以你可以簡單地做這樣的事情。
exports.getUser = function(_id) {
return collection.findOne({
_id
});
}
OP 嘗試將該函數用作異步函數,但它必須以這種方式進行限定並且必須返回一個承諾......
exports.getUser = async function(_id) {
return new Promise((resolve, reject) => {
collection.findOne({_id: _id}, (err, data) => {
err ? reject(err) : resolve(data)
})
})
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.