node.js - MethodOverride 不适用于 DELETE 请求
问题描述
我已经设法将文件上传到我的 postgres 数据库,但我无法实现删除请求。
我在控制器中的删除功能
static async deleteFile(req, res) {
try {
const { file_id } = req.params;
await FileModel.RemoveFile(file_id);
return res.redirect('/documents');
} catch (err) {
return res.send(err.message);
}
}
我的路线
router.delete("/documents/:file_id", tokenExists, userAccess, FileContainer.deleteFile);
我的 .ejs 文件 从这个文件中,我想执行删除请求。它包含一个表格,显示我的数据库中的所有文档。因此,我想单击一个垃圾桶图标并从我的后端和客户端中删除该特定行。
<table class="table table-striped table-dark mr-auto ml-auto" id="fileTable">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Uploaded On</th>
<th>Delete</th>
</tr>
</thead>
<tbody>
<% data.forEach(file => { %>
<tr>
<td class="file-title"><a href="documents/<%=file.file_name%>"
download="<%=file.file_name%>"><%=file.file_name%></a></td>
<td><%=file.file_type%></td>
<td><%=file.uploaded_at%></td>
<td>
<form id="deletingForm" action="/documents/<%=file.file_id%>?_method=DELETE" method="POST" onsubmit="deletingForm()">
<input class="fa fa-trash" type="submit" id="deleteFile" />
</form>
</td>
</tr>
<% }); %>
</tbody>
</table>
我尝试了什么以及真正发生了什么
我尝试发送上述请求,但我收到了不允许的方法!错误。请有人帮助我。提前致谢。
解决方案
问题在于method="POST"
,您实际上是在发送 POST 请求而不是 DELETE 请求。
即你的要求实际上是
POST /documents/n?_method=DELETE HTTP/1.1
不是
DELETE /documents/n?_method=DELETE HTTP/1.1
您需要做的是使用 JavaScript、jQuery 等发送实际的 DELETE 请求。顺便说一句,在 URL 中使用动词_method=DELETE
根本不是一个好主意。
要解决此问题,我会删除表单,只需deletingForm
单击您的deleteFile
输入直接调用您的方法,以通过 ajax 或其他方式发出 DELETE 请求。例如
$.ajax({
url: '/documents/' + fileId,
type: 'DELETE',
...
});
但是,您将遇到另一个问题,因为您正在为循环中的输入元素分配一个 ID - 但 ID 必须是唯一的 - 即您不能有多个具有 ID 的元素deleteFile
编辑:
要使用查询字符串值覆盖该方法,请将查询字符串键指定为 methodOverride 函数的字符串参数。
var express = require('express')
var methodOverride = require('method-override')
var app = express()
// override with POST having ?_method=DELETE
app.use(methodOverride('_method'))
推荐阅读
- java - @RequestBody 中的 Spring Enum 列表为空
- c# - 服务外部文件夹
- node.js - after nodejs update i get this error: Cast to ObjectId failed for value "600204c674086624b9de76e2" at path "classId" for model "Message"
- wso2is - 将 Ellucian 的 Ethos wso2 版本 5.10.0 连接到 Active Directory 的 LDAP 属性问题
- r - 仅当它也存在于另一个向量中(在 R 中)时才从向量中取值
- asp.net-mvc-5 - 如何在 MVC5 中的 AntiForgertyToken cookie 上设置 SameSite=None?
- transactions - IBM MQ 的保证交付如何运作
- android - Android GC 问题
- flutter - Flutter:为什么我不能将 TextField 中的光标移动到文本的开头?
- reactjs - 多反应选择的酶测试