【问题标题】:Node Express- delete route works but throws an errorNode Express-删除路由有效但抛出错误
【发布时间】:2021-07-08 17:25:01
【问题描述】:

我在 Node Express 中制作了一个 api 应用程序。路线 post 和 put 运行良好。删除路线也在工作,但我没有看到已解决承诺的确认,而是在几秒钟后我看到了这些错误

  1. CORS 策略已阻止从源“http://localhost:3000”访问“https://ahi”处的 XMLHttpRequest:请求的资源上不存在“Access-Control-Allow-Origin”标头。 PageAdmin.js:179 失败错误:网络错误
  2. 删除 https://ahi net::ERR_FAILED

我在开始在服务器上设置应用程序时已经在处理这个问题,所以我搜索了如何处理它。这是我在服务器上设置标头的中间件代码

function setHeaders(app) {
  app.use(function (req, res, next) {
    res.setHeader("Access-Control-Allow-Origin", "*");
    res.setHeader(
      "Access-Control-Allow-Methods",
      "GET, POST, OPTIONS, PUT, PATCH, DELETE"
    );
    res.setHeader(
      "Access-Control-Allow-Headers",
      "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Origin, Access-Control-Allow-Methods, x-auth-token"
    );
    res.setHeader("Access-Control-Allow-Credentials", true);
    // handle OPTIONS method
    if ("OPTIONS" == req.method) {
      return res.sendStatus(200);
    } else {
      next();
    }
  });
}

这是路线的代码

const express = require("express");
const router = express.Router();
const mongoose = require("mongoose");
const auth = require("../middleware/auth");
const { ProgrammingTool, validate } = require("../models/programmingTool");

const msg400 = "Bad request";
const msg400InData = "Item already exists in database";
const msg404 = "Could not find item in database";
const msg500 = "Something went wrong";

router.get("/", async (req, res) => {
  try {
    const tools = await ProgrammingTool.find();
    res.send(tools);
  } catch (e) {
    console.log("failed getting tools", e);
    res.status(500).send(msg500);
  }
});

router.get("/:id", async (req, res) => {
  if (!mongoose.Types.ObjectId.isValid(req.params.id))
    return res.status(404).send(msg404);
  const tool = await ProgrammingTool.findById(req.params.id);
  if (!tool) return res.status(404).send(msg404);
  res.send(tool);
});

router.post("/", auth, async (req, res) => {
  const validation = validate(req.body);
  if (validation.error) return res.status(400).send(msg400);

  try {
    const toolInData = await ProgrammingTool.findOne({ name: req.body.name });
    if (toolInData) return res.status(400).send(msg400InData);
  } catch (e) {
    return res.status(500).send(msg500);
  }

  const tool = new ProgrammingTool({ name: req.body.name });

  try {
    await tool.validate();
  } catch (e) {
    console.log("did not pass mongoose validation at posting", e);
    return res.status(400).send(msg400);
  }
  try {
    const result = await tool.save();
    res.send(result);
  } catch (e) {
    console.log("failed to post tool");
    res.status(500).send(msg500);
  }
});

router.delete("/:id", auth, async (req, res) => {
  const id = req.params.id;
  let tool;
  try {
    tool = await ProgrammingTool.findById(id);
  } catch (e) {
    console.log("could not find the tool with provided id", e);
    res.status(404).send(msg404);
  }
  try {
    await tool.delete();
  } catch (e) {
    console.log("failed deleting tool", e);
    res.status(500).send(msg500);
  }
});

router.put("/:id", auth, async (req, res) => {
  const validation = validate(req.body);
  if (validation.error) return res.status(400).send(msg400);

  const id = req.params.id;
  const tool = await ProgrammingTool.findById(id);
  if (!tool) res.status(404).send(msg404);

  tool.name = req.body.name;

  try {
    await tool.validate();
  } catch (e) {
    console.log("did not pass mongoose validation at putting", e);
    return res.status(400).send(msg400);
  }

  try {
    const result = await tool.save();
    res.send(result);
  } catch (e) {
    console.log("failed to save edited tool");
    res.status(500).send(msg500);
  }
});

router.delete("/", auth, (req, res) => {
  res.status(400).send(msg400);
});

router.put("/", auth, (req, res) => {
  res.status(400).send(msg400);
});

真正让我吃惊的是,错误被抛出,但路由可以正常工作,项目已从数据库中删除。

【问题讨论】:

  • 您的删除在第一个 catch 块中缺少返回。所以它发回错误。如果抛出错误,第二个 catch 块也会发回结果。您只能发回一次响应。

标签: javascript node.js mongodb express


【解决方案1】:

delete 路由有 2 个问题。

  1. 您没有使用return,因此即使在第一个错误之后,它也会进入第二个try catch 块。将return 添加到res.status(..).send(..)

  2. 对于成功的删除操作,您不会返回 2xx 状态代码。因此,如果删除成功,请求将被卡住,因为您没有返回任何内容,一段时间后可能会超时。

【讨论】:

  • 是的,这正是问题所在,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多