node.js - 使用最新版本的 socket.io 时我的 cors 出现问题
问题描述
我想知道是否有人可以帮助我使我的代码适应最新版本的 socket.io。我已经尝试实现新功能,但我仍然无法在终端中控制台记录任何内容,任何人都可以看到问题吗?这是我在刷新前端后尝试在后端控制台日志名称和房间时遇到的错误:
从源“http://localhost:3001”访问“http://localhost:3000/socket.io/?EIO=4&transport=polling&t=NOaiiEq”的 XMLHttpRequest 已被 CORS 策略阻止:“访问控制- Allow-Origin' 标头的值 'http://localhost:3000' 不等于提供的来源。
前端代码:
import React, { useState, useEffect } from "react";
import queryString from "query-string";
import io from "socket.io-client";
import { useLocation } from "react-router-dom";
const Chat = () => {
let location = useLocation();
const [ name, setName ] = useState('');
const [ room, setRoom ] = useState('');
const ENDPOINT = 'localhost:3000/chat';
useEffect(() => {
const { name, room } = queryString.parse(location.search)
const socket = io(ENDPOINT);
setName(name);
setRoom(room);
socket.emit('join', { name, room });
}, [ENDPOINT, location.search]);
return(
<h1>Chat</h1>
)
}
export default Chat;
```
backend code:
```
require("dotenv").config();
const express = require("express");
const app = express();
const server = require('http').createServer(app);
const io = require('socket.io')(server, {
cors: {
origin: "http://localhost:3000",
methods: ["GET", "POST"],
allowHeaders: ['x-secret-token'],
credentials: true
}
});
const client = require("./client");
// Run when a client connects
io.on('connection', (socket) => {
console.log('We have a new connection!');
socket.on('join', ({ name, room }) => {
console.log(name, room);
});
socket.on('disconnect', () => {
console.log('User has left!');
})
});
const bodyParser = require("body-parser");
app.use(bodyParser.json());
// app.use(express.json)
const cors = require("cors");
app.use(cors({
exposedHeaders: 'x-secret-token',
}))
//Routers
const registerRouter = require("./Routes/Register");
app.use("/register", registerRouter);
const loginRouter = require("./Routes/Login");
app.use("/login", loginRouter);
const booksRouter = require("./Routes/Books");
app.use("/books", booksRouter)
const chat = require("./Routes/Chat");
app.use("/chat", chat);
//Build server
app.set("port", process.env.port || 3000);
//Start server
server.listen(app.get("port"), (server) => {
console.info(`Server listen on port ${app.get("port")}`);
});
我还尝试添加 socket.io 推荐的客户端代码,如下所示:
// client-side
const io = require("socket.io-client");
const socket = io("https://api.example.com", {
withCredentials: true,
extraHeaders: {
"my-custom-header": "abcd"
}
});
但这没有用 - 任何建议都会很棒!
解决方案
你可以试试这个。希望它有效。祝你好运!
前端: const io = require("socket.io-client"); // 从“socket.io-client”导入 io;同上 require 模块
const socket = io("localhost:3001", { withCredentials: true, extraHeaders: { "my-custom-header": "text/plain" } });
推荐阅读
- botframework - microsoft bot 框架 - Skype for business - 错误
- openstack - openstack:无法从主机网络 ping 和 ssh 到访客网络
- string - 如何在 UNIX 中只转义文本中间的双引号?
- javascript - 更改 JS 中子 SVG 元素的属性
- ruby-on-rails - Airbnb 如何发送每篇文章?
- php - 如何在 Laravel 中使用数组访问数据库值
- javascript - RxJS 什么是镜像?
- asp.net-mvc-5 - Asp.Net MVC ValidationSummary HTML 错误信息
- python - 扩展 pyspark 的 DataFrame 类
- powershell - 如何在特定时间杀死一个进程并在 x 分钟后重新启动它?