【发布时间】:2021-03-03 17:10:20
【问题描述】:
服务器端
const express = require("express");
const socket = require("socket.io");
const http = require("http");
const { addUser, removeUser, getUser, getUsersInRoom } = require("./user");
const PORT = process.env.PORT || 8000;
// 2. 라우터 설정
const router = require("./router");
const app = express();
app.use(function (req, res, next) {
// Website you wish to allow to connect
res.setHeader("Access-Control-Allow-Origin", "http://localhost:3001");
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, PATCH, DELETE");
res.setHeader("Access-Control-Allow-Headers", "X-Requested-With,content-type");
res.setHeader("Access-Control-Allow-Credentials", true);
next();
});
const server = http.createServer(app);
const io = socket(PORT);
io.on("connection", (socket) => {
console.log("소켓 연결 완료");
socket.on("join", ({ name, room }, callback) => {
const { error, user } = addUser({ id: socket.id, name, room });
if (error) return callback(error); // username taken
socket.join(user.room);
socket.emit("message", {
user: "admin",
text: `${user.name}, welcome to the room ${user.room}`,
});
socket.broadcast
.to(user.room)
.emit("message", { user: "admin", text: `${user.name}, has joined!` });
io.to(user.room).emit("roomData", {
room: user.room,
users: getUsersInRoom(user.room),
});
callback();
});
socket.on("sendMessage", (message, callback) => {
const user = getUser(socket.id);
io.to(user.room).emit("message", { user: user.name, text: message });
// callback();
});
socket.on("disconnect", () => {
const user = removeUser(socket.id);
console.log("유저가 떠났습니다..");
if (user) {
io.to(user.room).emit("message", {
user: "Admin",
text: `${user.name} has left.`,
});
io.to(user.room).emit("roomData", {
room: user.room,
users: getUsersInRoom(user.room),
});
}
});
});
app.use(router);
server.listen(PORT, () => console.log(`server has started on port ${PORT}`));
这是客户端
import React, { useEffect, useState } from "react";
import queryString from "query-string";
import io from "socket.io-client";
import "./Chat.css";
// 하위 컴포넌트
import Messages from "../Messages/Messages";
import RoomInfo from "../RoomInfo/RoomInfo";
import Input from "../Input/Input";
let socket;
const Chat = ({ location }) => {
const [name, setName] = useState("");
const [room, setRoom] = useState("");
const [message, setMessage] = useState("");
const [messages, setMessages] = useState([]);
const [users, setUsers] = useState("");
const ENDPOINT = "http://localhost:8000/";
useEffect(() => {
const { name, room } = queryString.parse(location.search);
socket = io.connect(ENDPOINT); // 소켓 연결
setName(name);
setRoom(room);
console.log(name, room); // lama peru
// console.log(socket);
socket.emit("join", { name, room }, (error) => {
// console.log("error");
// 에러 처리
if (error) {
alert(error);
}
});
}, [ENDPOINT, location.search]);
useEffect(() => {
// 서버에서 message 이벤트가 올 경우에 대해서 `on`
socket.on("message", (message) => {
setMessages([...messages, message]);
});
socket.on("roomData", ({ users }) => {
setUsers(users);
});
}, [messages]);
// 메세지 보내기 함수
const sendMessage = (e) => {
e.preventDefault();
if (message) {
socket.emit("sendMessage", message, setMessage(""));
}
};
console.log(message, messages);
console.log(users, "users");
return (
<div className="chatOuterContainer">
<div className="chatInnerContainer">
<div className="appbar"></div>
<div className="chatScreen">
<div className="chatScreen">
<RoomInfo room={room} />
<div className="messageContainer">
<Messages messages={messages} name={name} />
</div>
<Input message={message} setMessage={setMessage} sendMessage={sendMessage} />
</div>
</div>
</div>
</div>
);
};
export default Chat;
当我尝试该网站时,我得到了这个 [在此处输入图片说明][1]
如您所见,响应标头中没有 Access-Control-Allow-Origin .. 我通过以下方式开始我的项目。
- 首先由“node server.js”启动服务器
- 通过命令“yarn start”启动客户端
cors 选项似乎不适用。 [1]:https://i.stack.imgur.com/QpQ7o.png
如果你能帮助我将非常感谢!
【问题讨论】: