簡體   English   中英

mongoDB collection.findOne() 返回未定義

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM