猫鼬 findOneAndUpdate 为 err 和 doc 返回 null(使用 Jest)
Posted
技术标签:
【中文标题】猫鼬 findOneAndUpdate 为 err 和 doc 返回 null(使用 Jest)【英文标题】:mongoose findOneAndUpdate returns null for both err and doc (using Jest) 【发布时间】:2018-11-18 18:30:52 【问题描述】:我正在使用 Mongoose 的 findOneAndUpdate 方法,但似乎无法从中获取任何有用的信息。我试过使用调用它返回的查询(在updatedUser
中),但它返回null
;我也尝试过包含回调参数,但是当我这样做时,err
和 doc
都会返回 null
。
上下文:我正在使用 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: '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
【问题讨论】:
可能 err 和 doc 都为 null,因为您没有错误,并且您的集合中没有与_id = user. _id
匹配的文档,因此您的 findOneAndUpdate
不返回任何内容(这意味着 null)
@Bentaiba 我也是这么想的,但是如果没有文档,它不应该在err
中返回一些东西吗?如果没有,err
中会显示什么?
【参考方案1】:
感谢您将问题解释得这么好。
MongoDB官方文档here中提到findOneAndUpdate
更新集合中第一个匹配请求的文档并返回原始文档。
我认为err
和doc
都为空,因为您要更新的文档在您的集合中不存在。如果没有与查询匹配的文档,文档中没有提到 findOneAndUpdate
的行为是什么。所以,我试图更深入地了解它。
我在文档中看到(您可以了解更多信息here),如果未提及参数upsert
,它将采用false
作为默认值。我在 P.S. 看到这里如果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 )); );
【参考方案2】:
编辑:不正确 - 请参阅其他答案。我想通了。我在变量有值之前异步返回它,所以它毕竟不是findOneAndUpdate
问题。 :/
【讨论】:
我真的不认为这是正确的答案。如果findOneAndUpdate
没有找到任何与您的请求匹配的文档,并不意味着这是一个错误。 err
为空,因为请求的执行没有错误。确实,您的代码是异步的,但您使用的是回调,因此给定的 err
和 doc
正是它应该返回的内容。您能否确保该文档存在于您的收藏中并尝试使用相同的代码对其进行更新并查看?
你可以在这里看到mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate,如果你使用回调,你会立即得到结果。以上是关于猫鼬 findOneAndUpdate 为 err 和 doc 返回 null(使用 Jest)的主要内容,如果未能解决你的问题,请参考以下文章
猫鼬 findOneAndUpdate 和 runValidators 不工作
猫鼬 findOneAndUpdate Upsert _id null?
将 findOne 和 findOneAndUpdate 与 HTTP 请求一起使用(猫鼬)
猫鼬不是 $setting array.$.booleanValue 当我 findOneAndUpdate(paramOne: p, paramTwo, array.keyName: valueNa
猫鼬不是 $setting array.$.booleanValue 当我 findOneAndUpdate(paramOne: p, paramTwo, array.keyName: valueNa