【发布时间】:2021-07-27 00:18:56
【问题描述】:
在客户端,它在useEffect 中调用socket.current.emit。我正在尝试将姓名和年龄发送到服务器并在服务器端io.on 终端中显示数据。我没有错误,终端没有显示任何内容。
后台
server.js
const express = require('express');
require('dotenv').config();
const app = express();
const port = process.env.PORT || 8000;
const server = app.listen(port, () => {
console.log(`connect on the port ${port} - ${process.env.NODE_ENV}`);
});
const io = require('socket.io').listen(server);
io.on('connection', socket => {
socket.on('hello', data => {
console.log({name: data.name, age: data.age});
});
});
前端
客户
import React, { useState, useRef, useEffect } from 'react';
import io from 'socket.io-client';
const ChatUser = () => {
const [values, setValues] = useState({
chatters: [],
idReceiver: '',
idSender: ''
});
const [activeUser, setActiveUser] = useState('');
const [message, setMessage] = useState('');
const [chats, setChats] = useState([]);
const socket = useRef();
useEffect(() => {
if(!socket.current) {
socket.current = io(process.env.REACT_APP_API);
}
if(socket.current) {
socket.current.emit('hello', {name: 'john', age: '23'});
}
}, []);
return (
<>
</>
);
};
//env
REACT_APP_API=http://localhost:8000/api
更新的后端
我在 server.js 中的代码也许我应该把 io.on 放在不同的地方?
const express = require('express');
const morgan = require('morgan');
const bodyParser = require('body-parser');
const cors = require('cors');
const mongoose = require('mongoose');
require('dotenv').config();
const db = require('./connection');
const app = express();
// Connect to our Database and handle an bad connections
mongoose
.connect(process.env.DATABASE, {
autoIndex: false
})
.then(() => console.log("DB server connect"))
.catch(() => console.log("DB server disconnect"))
const authRoutes = require('./routes/auth');
const userRoutes = require('./routes/user');
const messageRoutes = require('./routes/message');
const countriesRoutes = require('./routes/countries');
const languagesRoutes = require('./routes/languages');
const tutorRoutes = require('./routes/tutor');
app.use(morgan('dev'));
app.use(bodyParser.json({limit: '50mb'}));
app.use((req,res,next)=>{
res.header('Content-Type: application/json');
res.header('Access-Control-Allow-Origin','*');
res.header('Access-Control-Allow-Headers','Authorization, X-API-KEY, Origin, X-Requested-With, Content-Type, Access-Control-Allow-Request-Method');
res.header('Access-Control-Allow-Methods','GET, PUT, POST, DELETE, OPTIONS');
res.header('Allow','GET, PUT, POST, DELETE, OPTIONS');
req.io = io;
next();
});
if(process.env.NODE_ENV === 'development') {
app.use(cors());
}
const port = process.env.PORT || 8000;
const server = app.listen(port, () => {
console.log(`connect on the port ${port} - ${process.env.NODE_ENV}`);
});
const io = require('socket.io').listen(server, {
cors: {
origin: '*'
}
});
io.on('connection', socket => {
socket.on('hello', data => {
console.log({name: data.name, age: data.age});
});
});
//middleware
app.use('/api', authRoutes);
app.use('/api', userRoutes);
app.use('/api', countriesRoutes);
app.use('/api', languagesRoutes);
app.use('/api', tutorRoutes);
app.use('/api', messageRoutes);
请求标头
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7
Connection: keep-alive
Host: localhost:8000
Origin: http://localhost:3000
Referer: http://localhost:3000/
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"
sec-ch-ua-mobile: ?0
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
404 未找到 - 在终端中
GET /socket.io/?EIO=4&transport=polling&t=NtFERz- 404
【问题讨论】:
-
您确定浏览器控制台没有错误吗?我测试了你的代码,我在浏览器上看到了 CORS 错误。如果您可以确认您也在浏览器上收到此错误,那么此答案应该会有所帮助。 stackoverflow.com/a/38749535/6338245
-
@FahadFarooq 我在文件 server.js 中添加了我的完整代码。也许我应该把
io.on放在不同的地方或更改订单功能? -
当我运行你的后端代码时,我得到
TypeError: require(...).listen is not a function在线:const io = require("socket.io").listen(server, {。你使用的是哪个版本的socket.io? -
NVM,这里的问题是您尝试连接到错误的 url。
-
@FahadFarooq "socket.io-client": "^3.0.5",
标签: javascript node.js reactjs express sockets