【问题标题】:express Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the clientexpress 错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头
【发布时间】:2019-12-25 22:27:36
【问题描述】:

我正在尝试执行获取请求,但在 app.js res.json 行上一直失败。

app.js

app.use(function(err, req, res, next) {
  res.locals.message = err.message;
  res.locals.error = req.app.get("env") === "development" ? err : {};

  res.status(err.status || 500);
  res.json({ error: err.message });
});

型号

const fs = require("fs");
const fileName = "./seatData.json";
const file = require(fileName);

const Seat = function(seat) {
  this.seat = seat.seat;
  this.seatNumber = seat.seatNumber;
  this.price = seat.price;
  this.available = seat.available;
  this.disabilityAccessible = seat.disabilityAccessible;
};

Seat.findSeat = seatNumber => {
  return file.find(obj => obj.seatNumber === seatNumber);
};

Seat.getSeatByNumber = function(seatNumber, result) {
  this.seat = this.findSeat(seatNumber);
  if (Object.keys(this.seat).length > 0) {
    result(null, this.seat);
  } else {
    result({ error: true, message: "Seat not found" });
  }
};

Seat.bookSeat = function(seatNumber, result) {
  this.seat = this.findSeat(seatNumber);
  if (this.seat === undefined || Object.keys(this.seat).length === 0) {
    result({ error: true, message: "Seat not found" });
  }
  const newSeatData = file.map(row => {
    if (row.seatNumber === seatNumber) {
      row.available = false;
      this.seat = row;
    }
    return row;
  });
  fs.writeFile("./seatData.json", newSeatData, "utf-8", function(err) {
    if (err) {
      result({ error: true, message: "failed to update booking" });
    }
  });

  result(null, this.seat);
};

module.exports = Seat;

路线

router.get(
  "/bookSeat/:seatNumber",
  [
    check("seatNumber")
      .exists(true)
      .withMessage("Must pass seatNumber")
      .matches(/^[0-9][a-z]$/i)
      .withMessage("must start with a number(0-9) and end with a letter")
  ],
  actions.update_seat
);

控制器

exports.update_seat = (req, res) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    res.status(422).json({ error: true, message: errors.array() });
  }
  console.log(errors);
  Seat.bookSeat(req.params.seatNumber, (err, seat) => {
    if (err) res.json(err);
    else res.json(seat);
  });
};

我想打电话给bookSeathttps://codesandbox.io/s/elucidate-api-fokd8

【问题讨论】:

  • 那是因为向客户端发送数据后,路由端点发生错误。你能告诉我们相关的路线吗?
  • 已更新路线
  • actions.update_seat 是什么?
  • 用控制器更新

标签: javascript node.js api express


【解决方案1】:

发生错误后,你仍然继续执行:

 if (!errors.isEmpty()) {
  res.status(422).json({ error: true, message: errors.array() });
  return; // <<!!
 }

【讨论】:

  • 我是否需要对控制器中的所有错误执行此操作。我对他们所有人都有同样的问题。当我做if (err) res.json(err); 时有什么区别,那么它不会失败
  • 这是一个 if..else。
  • 如果我在 app.js 中注释掉 res.json({ error: err.message }); 它可以工作,但返回并没有改变失败
  • 然后有一些东西写到res,你还没有显示,但问题是一样的。
猜你喜欢
  • 2022-11-30
  • 2021-12-18
  • 1970-01-01
  • 2021-09-02
  • 2020-05-26
  • 2018-09-19
  • 2019-12-11
  • 2020-09-22
  • 2023-01-19
相关资源
最近更新 更多