mongoose findOneAndUpdate为err和doc返回null(使用Jest)

时间:2018-06-08 16:35:56

标签: javascript node.js mongoose jestjs

我正在使用Mongoose的findOneAndUpdate方法,似乎无法从中获取任何有用的信息。我尝试使用从调用它回来的查询(在updatedUser中),但它返回null;我也试过包含回调参数,但是当我这样做时,nullerr都会得到doc

上下文:我正在使用Jest构建测试套件,并为此函数编写测试。我已经在测试套件之外的应用程序中使用了该函数,虽然我已经更改了函数的一部分,但我没有在findOneAndUpdate调用中更改任何内容,除了添加回调参数。

预期行为: “错误”或“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: '24479981326297030000@test.com',
     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

2 个答案:

答案 0 :(得分:3)

我感谢你解释这个问题。 MongoDB here的官方文档中提到@EntityGraph(attributePaths = "machines") @Override List<Factories> findAll(); 更新集合中与请求匹配的第一个文档并返回原始文档。

我认为findOneAndUpdateerr都是null,因为您要更新的文档在您的集合中不存在。如果没有与查询匹配的文档,则文档中未提及doc的行为是什么。所以,我试图深入研究它。

我在文档中看到(您可以了解有关它的更多信息here),如果未提及参数findOneAndUpdate,则会将upsert作为默认值。我在P.S.中看到了这里。如果falseupsert且文档不存在,那么false将为doc

答案 1 :(得分:-1)

编辑:不正确 - 请参阅其他答案。我明白了。我在它有一个值之前异步返回变量,所以它毕竟不是findOneAndUpdate问题。 :/