node.js - 我看不出 put 和 patch 方法之间的区别
问题描述
如果我已经喜欢这句话,我只想喜欢或不喜欢。所以首先我找到报价,然后我检查我是否已经喜欢报价,如果不喜欢,那么我喜欢,否则我不喜欢。
我有一个像下面这样的路由器
router.put('/:quoteId', isAuth, quotesController.likeQuote);
而likeQuote方法如下
module.exports.likeQuote = (req, res, next) => {
const quoteId = req.params.quoteId;
const userId = req.userId;
Quote.findById(quoteId)
.then((quote) => {
if (quote.likes.indexOf(userId) == -1) {
quote.likes.push(userId);
} else {
quote.likes.pull(userId);
}
return quote.save();
})
.then((updatedQuote) => {
res.status(201).json({ message: 'You liked the post!' });
})
.catch((err) => {
err.statusCode = 500;
next(err);
});
但我的问题是,我只想知道PUT和PATCH是如何工作的?我认为我们应该在 PUT 中发送所有字段,而不是在 PATCH 方法中发送,但在我的情况下,我什至不发送任何字段并且两者都可以正常工作。这是怎么发生的?
解决方案
实际的 REST API 方法 ( PUT
, PATCH
, ... ) 没有任何限制。您选择编写的逻辑就是定义这一点的原因。现在你问的是“最佳实践”,每当你问这个问题时,你都会得到许多不同的答案。我将解释我的观点。
PUT
,所以本质PUT
是完全替换现有对象,这就是为什么人们告诉您发送整个对象,因为当您使用时PUT
,预期的是完全交换。
PATCH
,本质PATCH
是更新现有资源。这就是您要查找的内容,在这种情况下,您只需发送更新所需的必填字段。
现在,如果您写PUT
的是更新而不是完整的交换,这是错误的吗?我认为不是。只要您在整个应用程序中保持一致的逻辑,您就可以构建适合您需求的自己的“最佳实践”。
现在您确实将这个问题标记为Mongo
相关,所以我想向您介绍管道更新的概念(对于 Mongo v4.2+),您可以在其中执行您的逻辑在 1 次更新中。
推荐阅读
- angular - 以角度更改一个 QueryParam 但保留其他
- eclipse - Eclipse:串行终端:将 /n 视为 /n/r
- java - 按下后退按钮时如何从 PopupWindow 关闭应用程序?
- javascript - 如何抓取仅在单击按钮后才出现的数据?
- django - 如何获取相关列的值,Django
- linux - Docker 容器中的操作系统软件?
- html - 如何修复 html 中的 thymeleaf 语法错误?
- angular-material - 在 Mat-Icon Angular 7 中分配名称或 ID
- python - 如何在 matplotlib 中绘制具有标准化颜色的点?
- python - 从具有一个不同字段的后向外键关系中获取 django 查询集