mongoose findOneAndUpdate возвращает null как для err, так и для doc (используя Jest)

1

Я использую метод 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
  • 1
    Возможно, и err, и doc имеют значение null, потому что у вас нет ошибок, и в вашей коллекции нет документа, соответствующего _id = user. _id так что ваш findOneAndUpdate ничего не возвращает (что означает findOneAndUpdate )
  • 0
    @Bentaiba я думал , что тоже, но она не должна возвращать что - то в err , если нет документа? Если нет, что появляется в err ?
Теги:
jestjs
mongoose

2 ответа

1
Лучший ответ

Я благодарю вас за то, что вы хорошо объяснили эту проблему. Он упоминается в официальной документации MongoDB здесь что findOneAndUpdate обновляет первый документ в коллекции, которая соответствует запросу и вернуть исходный документ.

Я предположил, что оба err и doc имеют значение null из-за того, что документ, который вы хотите обновить, не существует в вашей коллекции. В документе не упоминается, что такое поведение findOneAndUpdate если нет документа, соответствующего запросу. Итак, я попытался углубиться в документацию.

Я видел в документации (вы можете узнать больше об этом здесь), что если параметр upsert не упоминается, он будет принимать значение false в качестве значения по умолчанию. И я увидел здесь в части PS, что если upsert является false и документ не существует, чем doc будет null.

  • 1
    Ты прав. После того, как я поднял свой ответ, я немного поработал над ним и тоже пришел к такому выводу, но забыл обновить свой ответ. Я обнаружил, что мне нужно написать свою собственную обработку ошибок ( 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 })); });
0

EDIT: неверно - см. Другой ответ. Я понял. Я возвращал переменную асинхронно, прежде чем она имела значение, поэтому она не была проблемой findOneAndUpdate. :/

  • 0
    Я действительно не думаю, что это правильный ответ. Если findOneAndUpdate не находит ни одного документа, соответствующего вашему запросу, это не значит, что это ошибка. err является нулем, потому что нет ошибки при выполнении запроса. Это правда, что ваш код асинхронный, но вы используете обратные вызовы, так что указанные err и doc именно то, что должно быть возвращено. Можете ли вы убедиться, что документ существует в вашей коллекции, и попытаться обновить его с тем же кодом и посмотреть?
  • 0
    Вы можете увидеть здесь mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate, что если вы используете обратные вызовы, вы получите результаты немедленно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню