Я использую метод Mongoose findOneAndUpdate и, похоже, не получаю от него никакой полезной информации. Я попытался использовать запрос, который возвращается из его вызова (в updatedUser
), но он возвращает null
; Я также пытался включить аргумент обратного вызова, но когда я это делаю, я возвращаю null
для err
и doc
.
Контекст: я использую Jest для сборки набора тестов и написания теста для этой функции. У меня была функция, работающая в моем приложении вне набора тестов, и, хотя я изменил часть функции, я ничего не изменил в вызове findOneAndUpdate, за исключением добавления аргумента обратного вызова.
Ожидаемое поведение: либо "err", либо "doc" не возвращает значение null, поэтому я, по крайней мере, знаю, что происходит.
Я работал с Mocha, и я изучаю Jest, и я обнаружил пару других интересных вещей, которые делает Jest. Я знаю по опыту, что это, скорее всего, я пропустил что-то довольно очевидное, но я бы с удовольствием мог обвинить что-то еще на этот раз. :)
updateUser.js:
const updateUser = async (user) => {
console.log('user in updater:', user);
const updatedUser = await User.findOneAndUpdate(
{ _id: user._id },
{
$set: {
name: user.name,
email: user.email,
password: user.password,
ageRange: user.ageRange,
gender: user.gender,
accountCreatedAt: user.accountCreateAt,
meetingPlaces: user.meetingPlaces,
flags: user.flags,
tokens: user.tokens,
}
},
{ new: true },
(err, doc) => {
console.log(err, doc);
}
);
//placeholders until I get some kind of usable response from findOneAndUpdate
return {err: false, res: 'cat'};
};
вывод терминала:
console.log server/db/crud_Users/updateUser.js:8
user in updater: { _id: 5b1aa9a146b59048dd86dbc2,
name: 'test',
email: '[email protected]',
password: 'testtest',
ageRange: '1',
gender: 'Female',
accountCreatedAt: '2018-06-08T11:06:57-05:00',
meetingPlaces: [],
flags: [],
tokens: [],
homeLocations: [],
hostedEvents: [],
attendingEvents: [],
__v: 0 }
console.log server/db/crud_Users/updateUser.js:28
null null
console.log server/db/crud_Users/updateUser.js:32
updatedUser: null
Я благодарю вас за то, что вы хорошо объяснили эту проблему. Он упоминается в официальной документации MongoDB здесь что findOneAndUpdate
обновляет первый документ в коллекции, которая соответствует запросу и вернуть исходный документ.
Я предположил, что оба err
и doc
имеют значение null из-за того, что документ, который вы хотите обновить, не существует в вашей коллекции. В документе не упоминается, что такое поведение findOneAndUpdate
если нет документа, соответствующего запросу. Итак, я попытался углубиться в документацию.
Я видел в документации (вы можете узнать больше об этом здесь), что если параметр upsert
не упоминается, он будет принимать значение false
в качестве значения по умолчанию. И я увидел здесь в части PS, что если upsert
является false
и документ не существует, чем doc
будет null
.
if doc = null //return a custom error message
). В итоге я переписал его с помощью Promises, так что теперь это выглядит так (извините за плохое форматирование): return new Promise((resolve, reject) => { User.findByIdAndUpdate(user._id, {$set: userWithChanges}, { new: true }).then((res) => { resolve({ err: null, res }); }).catch((err) => resolve({ err, res: null })); });
EDIT: неверно - см. Другой ответ. Я понял. Я возвращал переменную асинхронно, прежде чем она имела значение, поэтому она не была проблемой findOneAndUpdate
. :/
findOneAndUpdate
не находит ни одного документа, соответствующего вашему запросу, это не значит, что это ошибка. err
является нулем, потому что нет ошибки при выполнении запроса. Это правда, что ваш код асинхронный, но вы используете обратные вызовы, так что указанные err
и doc
именно то, что должно быть возвращено. Можете ли вы убедиться, что документ существует в вашей коллекции, и попытаться обновить его с тем же кодом и посмотреть?
_id = user. _id
так что вашfindOneAndUpdate
ничего не возвращает (что означаетfindOneAndUpdate
)err
, если нет документа? Если нет, что появляется вerr
?