Express Router .delete returns 404 Not Found?



在Express应用程序中使用删除方法时遇到一个奇怪的问题。

这是我的app.js文档。我正在使用elevatorRouter/电梯";路线。

app.js

app.use("/", indexRouter);
app.use("/users", usersRouter);
app.use("/passwordgenerator", passwordgeneratorRouter);
app.use("/elevators", elevatorRouter);
// catch 404 and forward to error handler
app.use(function (req, res, next) {
next(createError(404));
});
// error handler
app.use(function (err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get("env") === "development" ? err : {};
// render the error page
res.status(err.status || 500);
res.render("error");
});
module.exports = app;

这是我的路线文件。我包括了app.js中的电梯路由器。看来编辑路由运行良好。我只对";删除";方法

电梯.js

const express = require("express");
const router = express.Router();
const Elevator = require("../models/elevator");
const middleware = require("../middleware");
// Edit Elevator Route
router.get("/:id/edit", (req, res) => {
Elevator.findById(req.params.id, (err, foundElevator) => {
res.render("elevators/edit", { elevator: foundElevator });
});
});
// Delete Elevator Route
router.delete("/:id", (req, res) => {
Elevator.findByIdAndRemove(req.params.id, (err) => {
if (err) {
res.redirect("/elevators");
} else {
res.redirect("/elevators");
}
});
});

以下是我的看法。我没有完全发布整个html。相反,我已经部分复制了。我相信这就足够了。我用邮递员发送";POST";方法,但是仍然接收到相同的404错误。我认为这与视图无关

视图

<div class="col-md-9">
<div class="card">
<img src="<%= elevator.image %>" class="card-img-top" alt="..." />
<div class="card-body">
<h4 class="card-title"><%= elevator.projectName%></h4>
<p><%= elevator.projectNumber %></p>
<% if(user) { %>
<form
class="delete-form"
action="/elevators/<%= elevator._id %>?_method=DELETE"
method="post"
>
<button class="btn btn-danger">Delete</button>
</form>
<% } %>
</div>
<div class="card-body">
<a href="/elevators" class="btn btn-light float-right">Back</a>
</div>
</div>
</div>

您无法通过POST HTTP请求从DELETE路由获得响应。这是浏览器的一个众所周知的问题,但HTML表单只能通过POST发送FormData,而DELETE是不兼容的。因此,Express路由不匹配,并表示POST:"/:id"路由不存在。尝试将.delete更改为.post,它将起作用。

编辑:有一个方法覆盖模块,通过查询参数_method(或您选择的任何其他名称(将POST请求转换为DELETE。

最新更新