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)
    })
  })
}