【问题标题】:Express Router .delete returns 404 Not Found?Express Router .delete 返回 404 Not Found?
【发布时间】:2020-10-23 01:36:41
【问题描述】:

在 Express 应用中使用 delete 方法时遇到一个奇怪的问题。

这是我的 app.js 文档。我正在为“/电梯”路线使用电梯路由器。

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>

【问题讨论】:

    标签: mongodb express mongoose methods


    【解决方案1】:

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

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

    【讨论】:

    • 我正在使用“?_method=DELETE”覆盖的方法。我相信这是克服您在表单中提到的挑战的技巧。
    • 无论如何都会被忽略。只要您发送 POST HTTP 请求,就无法发送查询参数,因为它们属于 GET HTTP 请求。即使他们被派去,他们也可能什么都不做。据我所知,Express 不会寻找_method 查询参数来调度路由。
    • 我的错误,有疑问,我搜索并看到可以将查询字符串(在操作 URL 中)和 POST FormData 结合起来;我一直认为不是。但这并没有改变 Express 对待它的方式。并且有效地存在方法覆盖模块,但它没有出现在您的代码中。你需要吗?
    • 我在 Express 应用中发现了很多使用该方法的示例。正如你所建议的,使用“post”方法解决了这个问题。但是,我想找出是什么阻止我实施示例中的方法。无论如何感谢您的建议。
    • 我到现在都不知道这个模块的存在,但它看起来很棒。但是,您的代码示例不包含 app.use(require('method-override')('_method'))。你的代码中有那行吗?见:npmjs.com/package/method-override
    猜你喜欢
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    相关资源
    最近更新 更多