首页 > 解决方案 > 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>

我尝试了什么以及真正发生了什么

我尝试发送上述请求,但我收到了不允许的方法!错误。请有人帮助我。提前致谢。

标签: node.jsexpressejs

解决方案


问题在于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'))

见:https ://github.com/expressjs/method-override


推荐阅读