Aks*_*hot 6 javascript rest routes node.js express
在我的快递应用程序中,我有两条路线如下:
router.post('/:date', (req, res) => {
// if date exists, redirect to PUT
// else add to database
})
router.put('/:date', (req, res) => {
// update date
})
Run Code Online (Sandbox Code Playgroud)
如果通话中date已经存在POST,我想重定向到PUT. 使用什么最好的方法来做到这一点res.redirect?
在docs 中,所有重定向都指向不同的 URL 模式。我想保持 URL 不变,并将其余动词从 更改POST为PUT。
我查看了这个SO 问题,并在POST以下内容中添加了这一行:
res.redirect(303, '/:date');
但它没有将我重定向到PUT.
由于多种原因,您在这里尝试执行的操作将不起作用,但幸运的是您不需要执行任何操作 - 见下文。
您在此处使用的 303“查看其他”重定向,根据规范,后面应始终跟有 GET(或 HEAD)请求,而不是 PUT 或其他任何内容。请参阅 RFC 7231,第 6.4.4 节:
相关部分:
303(参见其他)状态代码表示服务器正在将用户代理重定向到不同的资源,如 Location 标头字段中的 URI 所示,旨在为原始请求提供间接响应。 用户代理可以执行针对该 URI 的检索请求(如果使用 HTTP,则为 GET 或 HEAD 请求),该请求也可能被重定向,并呈现最终结果作为原始请求的答案。请注意,Location 标头字段中的新 URI 不被视为等同于有效请求 URI。[强调]
其他流行的重定向类型 - 301“永久移动”和 302“找到”在实践中通常与规范相反,就好像它们是 303“查看其他”一样,因此发出 GET 请求。
请参阅Wikipedia 上的HTTP 状态代码列表:
这是行业实践与标准相矛盾的一个例子。HTTP/1.0 规范 (RFC 1945) 要求客户端执行临时重定向(最初的描述短语是“暂时移动”),但流行的浏览器使用 303 See Other 的功能实现 302。因此,HTTP/1.1添加了状态码303和307来区分这两种行为。但是,某些 Web 应用程序和框架使用 302 状态代码,就好像它是 303 一样。[强调]
有一个 307 临时重定向(自 HTTP/1.1 起),但它明确禁止更改 HTTP 方法,因此您只能将 POST 重定向到 POST、将 PUT 重定向到 PUT 等。这有时很有用,但在这种情况下不起作用 - 请参阅维基百科:
在这种情况下,应该使用另一个 URI 重复请求;但是,将来的请求仍应使用原始 URI。与历史上 302 的实现方式相反,重新发出原始请求时不允许更改请求方法。例如,应使用另一个 POST 请求重复一个 POST 请求。
这个 307 重定向仍然不是您想要的,即使是,据我所知,它也没有得到普遍支持,因此需要谨慎使用。
另请参阅此答案以获取更多信息:
您可以抽象出您的控制器 - 对于任何复杂的事情,您通常都会这样做:
// controllers - usually 'required' from a different file
const update = (req, res) = {
// update date
};
const add = (req, res) => {
if (date exists) {
return update(req, res);
}
// add to database
};
router.post('/:date', add);
router.put('/:date', update);
Run Code Online (Sandbox Code Playgroud)
或者您可以将控制器的部分抽象为函数。
另请注意,您可以编写为此处可能起作用的每个 HTTP 方法调用的通用控制器:
router.use('/:date', (req, res) => {
});
Run Code Online (Sandbox Code Playgroud)
请注意,您在这里所做的不是通常的 RESTful 命名路径的方式,并且在您的情况下仅对新日期和更新日期使用 PUT 可能是有意义的。
与许多人认为的相反,PUT 并不意味着 UPDATE。它的意思是把一个资源(无论新的还是新的)放到一个特定的 URL 上(如果旧的已经存在则覆盖它)。这很像在 shell 中编写:
echo abc > /the/path/to/file.txt
Run Code Online (Sandbox Code Playgroud)
如果文件存在,它将“更新”文件,如果不存在,它也会创建一个新文件。
例如,如果您有 /users/:id 路径,那么您可以使用:
在这里,据我了解,您的 :date 就像一个 ID,即。如果该记录已存在,则要覆盖该记录;如果该记录不存在,则要创建该记录。在这两种情况下,您都提供 :date 路径组件,因此您也可以在所有情况下使用 PUT。
换句话说,您无法从一种 HTTP 方法重定向到另一种 HTTP 方法(GET 除外),但在这种情况下您不需要这样做。
| 归档时间: |
|
| 查看次数: |
2322 次 |
| 最近记录: |