在Express应用程序中使用删除方法时遇到一个奇怪的问题。
这是我的app.js文档。我正在使用“ /电梯”路线的lifterRouter。
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的电梯路由器。看来编辑路线运作良好。我只有“删除”方法有问题。
elevators.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>
答案 0 :(得分:0)
您无法从POST HTTP请求的DELETE路由获得响应。这是浏览器的一个著名问题,但是HTML表单只能通过POST发送FormData,并且DELETE不兼容。
因此,Express路由不匹配,并说POST:“ /:id”路由不存在。
尝试将.delete
更改为.post
,它将起作用。
编辑:有一个方法覆盖模块,可通过查询参数_method
(或您选择的任何其他名称)将POST请求转换为DELETE。