mongoDB collection.findOne返回未定义

问题描述

我在用于获取用户文件中有一个函数,该函数中的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)
    })
  })
}