【问题标题】:mongoDB collection.findOne() returns undefinedmongoDB collection.findOne() 返回未定义
【发布时间】:2020-08-25 06:32:52
【问题描述】:

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

【问题讨论】:

    标签: javascript node.js node-modules


    【解决方案1】:

    OP 尝试将该函数用作异步函数,但它必须以这种方式进行限定并且必须返回一个 Promise...

    exports.getUser = async function(_id) {
      return new Promise((resolve, reject) => {
        collection.findOne({_id: _id}, (err, data) => {
          err ? reject(err) : resolve(data)
        })
      })
    }
    

    【讨论】:

      【解决方案2】:

      尝试给出集合名称;

      db.getCollection("<COLLECTION_NAME").find({})....
      

      【讨论】:

      • 应该提到我已经使用了集合名称
      【解决方案3】:

      我怀疑使用回调和 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() 而不是在那里定义它。

      【讨论】:

        【解决方案4】:

        如果你想使用await 调用它,你需要让getUser 返回一个promise。从回调函数返回值不会向调用者返回任何内容。

        如今,findOne 在您未通过回调时返回一个承诺。所以你可以简单地做这样的事情。

        exports.getUser = function(_id) {
            return collection.findOne({
                _id
            });
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-26
          • 1970-01-01
          • 2016-04-05
          • 2019-07-12
          • 2017-02-01
          • 1970-01-01
          • 2019-11-17
          相关资源
          最近更新 更多