如何解决:错误[ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置标头

问题描述 投票:0回答:1

我有一个节点/快速服务器代码为

index.js

const express = require("express");
const Room = require("./models/room");
const roomRouter = require("./routes/room");
require("./models/db");
const cors = require("cors");

const port = process.env.PORT || 5000;

const app = express();

const server = require("http").createServer();

app.use(express.json());
app.use(roomRouter);

const io = require("socket.io")(server, {
  cors: {
    origin: "http://localhost:3000",
    methods: ["GET", "POST"],
  },
});

// const io = require("socket.io")(server);

app.get("/", (req, res) => {
  res.send("hello world");
});

app.use((req, res, next) => {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader("Access-Control-Allow-Credentials", "true");
  res.setHeader("Access-Control-Max-Age", "1800");
  res.setHeader("Access-Control-Allow-Headers", "content-type");
  res.setHeader(
    "Access-Control-Allow-Methods",
    "PUT, POST, GET, DELETE, PATCH, OPTIONS"
  );
  next();
});
app.use(cors());

io.on("connection", (socket) => {
  console.log("Connected");

  const id = socket.handshake.query.id;
  socket.join(id);

  socket.on("roomCreated", async (roomId) => {
    console.log("Room created with id of " + roomId);
    const isRoomExist = await Room.findOne({ roomId });
    if (isRoomExist) return;
    const room = await Room({ roomId });
    await room.save();
  });
});

server.on("request", app);

server.listen(port, () => {
  console.log("running on 5000");
});

我正在使用套接字 io,我想从 localhost:3000 发送请求,这就是我需要允许 CORS 选项的原因。所以我写了上面的代码。但是一旦我运行服务器,它就会抛出错误,指出:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:371:5)
    at ServerResponse.setHeader (node:_http_outgoing:576:11)
    at expressInit (B:\projects\typingtestserver\node_modules\express\lib\middleware\init.js:30:42)
    at Layer.handle [as handle_request] (B:\projects\typingtestserver\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (B:\projects\typingtestserver\node_modules\express\lib\router\index.js:323:13)
    at B:\projects\typingtestserver\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (B:\projects\typingtestserver\node_modules\express\lib\router\index.js:341:12)
    at next (B:\projects\typingtestserver\node_modules\express\lib\router\index.js:275:10)
    at query (B:\projects\typingtestserver\node_modules\express\lib\middleware\query.js:45:5)
    at Layer.handle [as handle_request] (B:\projects\typingtestserver\node_modules\express\lib\router\layer.js:95:5)
node:_http_outgoing:576
    throw new ERR_HTTP_HEADERS_SENT('set');
    ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:371:5)
    at ServerResponse.setHeader (node:_http_outgoing:576:11)
    at ServerResponse.writeHead (node:_http_server:308:21)
    at respond (B:\projects\typingtestserver\node_modules\engine.io\build\transports\polling.js:242:22)
    at Polling.doWrite (B:\projects\typingtestserver\node_modules\engine.io\build\transports\polling.js:247:13)
    at Polling.write (B:\projects\typingtestserver\node_modules\engine.io\build\transports\polling.js:221:14)
    at doWrite (B:\projects\typingtestserver\node_modules\engine.io\build\transports\polling.js:203:18)
    at B:\projects\typingtestserver\node_modules\engine.io-parser\build\cjs\index.js:19:17
    at encodePacket (B:\projects\typingtestserver\node_modules\engine.io-parser\build\cjs\encodePacket.js:10:12)
    at B:\projects\typingtestserver\node_modules\engine.io-parser\build\cjs\index.js:16:39 {
  code: 'ERR_HTTP_HEADERS_SENT'
}

附注当我打开 localhost:5000 时,它显示“Hello world”。

编辑:

房间路由器代码:

路线/room.js

const express = require("express");
const Room = require("../models/room");

const router = express.Router();

router.post("/checkId", async (req, res) => {
  console.log("got post request");
  const { roomId } = req.body;
  if (!roomId) res.json({ success: false, message: "No room id typed1" });

  try {
    const room = await Room.findOne({ roomId });

    if (room) res.json({ success: true, message: "Found the room" });
    else res.json({ success: false, message: "Didn't find the room" });
  } catch (err) {
    res.json({
      success: true,
      message: "Error in finding room. Try entering id again",
    });
  }
});

module.exports = router;

模型/room.js

const mongoose = require("mongoose");

const PlayerSchema = new mongoose.Schema(
  {
    username: {
      type: String,
      required: true,
    },
    ishost: {
      type: Boolean,
      default: false,
      required: true,
    },
  },
  { timestamps: true }
);

const RoomSchema = new mongoose.Schema(
  {
    roomId: {
      type: String,
      required: true,
    },
    players: [PlayerSchema],
  },
  { timestamps: true }
);

module.exports = mongoose.model("Room", RoomSchema

);

node.js express
1个回答
0
投票

已解决:

在index.js 文件中,我使用了

server.on("request", app)
,但由于某种我不知道的原因,这出现了问题。使用删除该行并使用
const server = require("http").createServer(app);
而不是
const server = require("http").createServer();

后问题得到解决
© www.soinside.com 2019 - 2024. All rights reserved.