Express Router .delete返回404找不到?

时间:2020-10-20 20:47:28

标签: mongodb express mongoose methods

在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>

1 个答案:

答案 0 :(得分:0)

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

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