我有一个用Express编写的现有项目,其中我制作了一个消息传递系统。POST/GET方法(用于发送和接收消息)的所有工作都在进行。我想让它们实时出现,所以我在客户端和服务器端都安装了socket.io
。在server.js
中,我添加了以下行:
const http = require("http");
const io = require("socket.io");
const server = http.createServer();
const socket = io.listen(server);
并将我的app.listen(...)
更改为server.listen(...)
。还增加:
socket.on("connection", socket => {
console.log("New client connected");
socket.on('test', (test) => {
console.log('test-test')
});
socket.emit('hello', {hello:'hello!'});
socket.on("disconnect", () => console.log("Client disconnected"));
});
在前面部分,我将以下代码放在ComponentDidMount
方法中:
const socket = socketIOClient();
socket.emit('test', {test:'test!'})
socket.on('hello', () => {
console.log('aaa')
})
现在我有两个问题。虽然console.log()工作正常,但我在React应用程序上发现了一个错误:
WebSocket connection to 'ws://localhost:3000/sockjs-node/039/lmrt05dl/websocket' failed: WebSocket is closed before the connection is established.
这正常吗?
另外,当我将app.listen(...)
更改为server.js
文件中的server.listen(...)
时,路由将停止工作。所有的POST和GET方法都不起作用,因为服务器无休止地响应。是否可以仅在特定路由文件中的特定方法上使用socket.io?
我以这样的方式保存路由:app.use('/api/user',user);
,其中user是路由器文件。
更新:完整的server.js需要:
const express = require('express');
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const bodyparser = require('body-parser');
const passport = require('passport');
const user = require('./routes/api/v1/User');
const company = require('./routes/api/v1/Company');
const http = require("http");
const io = require("socket.io");
const app = express();
dotenv.config();
app.use(passport.initialize());
require('./config/seed');
require('./config/passport')(passport);
const server = http.createServer();
const socket = io.listen(server);
您没有正确初始化服务器。尝试进行以下更改
// const server = http.createServer();
const server = http.createServer(app);
并确保您在server
上侦听,而不是在io
上侦听
server.listen(PORT_GOES_HERE)
“更新”工作示例:
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(80);
// WARNING: app.listen(80) will NOT work here!
// DO STUFF WITH EXPRESS SERVER
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
io.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
欲知更多详情,请点击:https://socket.io/docs/