我有一个节点/快速服务器代码为
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
);
已解决:
在index.js 文件中,我使用了
server.on("request", app)
,但由于某种我不知道的原因,这出现了问题。使用删除该行并使用 const server = require("http").createServer(app);
而不是 const server = require("http").createServer();
后问题得到解决