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