Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mongoose findOneAndUpdate为err和doc返回null(使用Jest)_Javascript_Node.js_Mongoose_Jestjs - Fatal编程技术网

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

Javascript mongoose findOneAndUpdate为err和doc返回null(使用Jest),javascript,node.js,mongoose,jestjs,Javascript,Node.js,Mongoose,Jestjs,我正在使用Mongoose的findOneAndUpdate方法,似乎无法从中获得任何有用的信息。我尝试使用调用它后返回的查询(在updateuser中),但它返回null;我也尝试过包含回调参数,但当我这样做时,我得到了err和doc的null返回 上下文:我正在使用Jest构建一个测试套件,并为此函数编写一个测试。我在测试套件之外的应用程序中使用了该函数,虽然我更改了该函数的部分内容,但除了添加回调参数外,我在findOneAndUpdate调用中没有更改任何内容 预期行为: “err”或“

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

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

预期行为: “err”或“doc”都不返回null,所以我至少知道发生了什么

我和摩卡共事过,我正在学习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

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

谢谢你对这个问题解释得这么好。 MongoDB的官方文档中提到,
findOneAndUpdate
更新集合中与请求匹配的第一个文档并返回原始文档

我认为
err
doc
都是空的,因为您要更新的文档在您的集合中不存在。如果没有与查询匹配的文档,文档中没有提到
findOneAndUpdate
的行为。所以,我试着深入研究


我在文档中看到(您可以了解更多信息),如果没有提到参数
upsert
,它将把
false
作为默认值。我在这里的P.S.部分看到,如果
upsert
false
并且文档不存在,那么
doc
将为
null

可能err和doc都为null,因为您没有错误,并且您的集合中没有与
\u id=user匹配的文档_id
所以你的
findOneAndUpdate
不返回任何东西(这意味着null)@Bentaiba我也这么认为,但是如果没有文档,它不应该在
err
中返回一些东西吗?如果不是,在
err
中会出现什么?我真的认为这不是正确的答案。如果
findOneAndUpdate
没有找到任何与您的请求匹配的文档,并不意味着这是一个错误<代码>错误
为空,因为在执行请求时没有错误。确实,您的代码是异步的,但您正在使用回调,因此给定的
err
doc
正是应该返回的。请确保您的集合中存在该文档,并尝试使用相同的代码对其进行更新,然后查看?您可以在此处看到,如果使用回调,您将立即得到结果。您是对的。在我提出我的答案后,我又做了一点,也得出了这个结论,但忘了更新我的答案。我发现我必须编写自己的错误处理(
如果doc=null//返回自定义错误消息
)。最后我用承诺重写了它,所以现在看起来是这样的(很抱歉格式不好):
返回新的承诺((解析,拒绝)=>{User.findbyiandupdate(User.\u id,{$set:userWithChanges},{new:true})。然后((res)=>{resolve({err:null,res});}.catch((err=>resolve({err,res:null});})