socket.io 连接不适用于 react.js

Posted

技术标签:

【中文标题】socket.io 连接不适用于 react.js【英文标题】:socket.io connection is not working with react.js 【发布时间】:2019-01-11 08:11:25 【问题描述】:

我有一个 reactjs 项目和 node.js 项目。现在我需要在我的项目中设置 socket.io。但设置后我收到 404 错误。我厌倦了使用交叉和其他方法,但我仍然得到相同的 404 错误。提前致谢

Index.js

const express = require("express");
const port = 3000;
const app = express();
const url = require("url");
var http = require('http').Server(app);
var io = require('socket.io')(http);

const origin = url.parse(`http://$process.env.CII_RESTURL || "localhost"/`)
.origin;
var cors = require("cors");
app.use(cors());
var bodyParser = require("body-parser");

var path = require("path");
app.use(bodyParser.urlencoded( extended: true ));
app.use(bodyParser.json());
var router = express.Router();
app.set("port", port);
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "ejs");
app.use(express.json());
app.use(express.static(__dirname + "./../../"));
app.use(function(req, res, next) 
res.header("Access-Control-Allow-Origin", "*");
res.header(
    "Access-Control-Allow-Headers",
    "Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With"
);
res.header("Access-Control-Allow-Origin", req.headers.origin);
res.header('Access-Control-Allow-Credentials', true);
next();
);
// create a GET route
app.get("/express_backend", (req, res) => 
res.send( express: "YOUR EXPRESS BACKEND IS CONNECTED TO REACT" );
);

app.use("/api", router);
var getTags = require("./routes/search");

router.get("/jobSearch", plainSearch.SearchByJob);
// console.log that your server is up and running
app.listen(port, () => 
console.log(`Listening on port: $port`);
console.log("Application live on the hostname: " + origin);
);

router.get("/",function(req,res)
res.send("hi")
)
//io.origins(cors());
io.on('connection', function(socket)
console.log("sd");
socket.on('subscribeToTimer', function(msg)
    console.log('message: ' + msg); 
);
);

反应组件

import io from 'socket.io-client';

const socket = io("http://localhost:3000/",
    path: '/api'
);

    subscribeToTimer(cb) 
    alert("sd");
    socket.on('timer', timestamp => cb(null, timestamp));
    socket.emit('subscribeToTimer', 1000);
 

在构造函数中调用 subscribeToTimer 函数。

【问题讨论】:

如果你使用过react组件和生命周期方法,你能发布吗? 【参考方案1】:

您似乎没有使用正确的反应生命周期方法来监听套接字。始终使用componentDidMount() 来监听套接字或发送 API 请求。试试这样的。

   subscribeToTimer(cb) 
        alert("sd");
        socket.on('timer', timestamp => cb(null, timestamp));
        socket.emit('subscribeToTimer', 1000);
          

     componentDidMount()
        subscribeToTimer(cb);
    

【讨论】:

以上是关于socket.io 连接不适用于 react.js的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 适用于 localhost 但不适用于 Heroku 服务器

Socket.io + NodeJS 不适用于 Heroku

Socket.io 适用于桌面 safari 和 chrome,但不适用于移动设备

如何通过 Express JS 服务器使 React JS 和 Socket IO 连接在一起?

无法在 socket.io 回调 React.js 中调用 setState

Socket.io 不适用于 https(让我们加密)