Коллекция MongoDB.findOne() возвращает неопределенное значение

#javascript #node.js #node-modules

#javascript #node.js #узлы-модули

Вопрос:

У меня есть функция в файле, которую я использую для получения пользователей, 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"
  

Ответ №1:

OP пытается использовать функцию как асинхронную, но она должна быть определена таким образом и должна возвращать обещание…

 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({})....
  

Комментарии:

1. Следовало бы упомянуть, что я уже использовал название коллекции

Ответ №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:

Вам нужно заставить getUser возвращать обещание, если вы хотите вызвать его с помощью await . Возврат значения из вашей функции обратного вызова ничего не возвращает вызывающему.

В наши дни findOne возвращает обещание, когда вы не передаете обратный вызов. Таким образом, вы можете просто сделать что-то вроде этого.

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