以我对套接字还不熟悉为前提,我试图在服务器上设置第一个配置(Node /Express)。
在这样做的时候,我遇到了一个问题,每次我保存时,都会遇到无恶魔崩溃的问题,方法是返回Error: listen EADDRINUSE: address already in use :::8080
。
在这里,服务器实现:
import express from "express";
import cors from "cors";
import { Server, Socket } from "socket.io";
import { createServer } from "http";
import morgan from "morgan";
// App configuration
const app = express();
const server = createServer(app);
const io = new Server(server);
const port = process.env.PORT || 8080;
// Middlewares
app.use(cors());
app.use(express.json());
app.use(morgan("combined"));
// Socket connection
io.on("connect", (socket: Socket) => {
socket.send("test");
});
server.listen(port, () => {
console.log(`Server is up and running on ${process.env.NODE_ENV} - port ${port}`);
});
我认为这是因为socket.io连接从未被关闭/断开,服务器实例处于监听状态。
我环顾四周,发现许多q/a都在建议命令来查找和终止进程,但我需要一个解决方案,以便在每次快速服务器被拒绝时自动断开套接字。
我尝试了以下几点:
io.on("disconnect", () => {
io.sockets.disconnect();
}
正如建议的那样,here,但是TS抱怨使用Property 'disconnect' does not exist on type 'Namespace<DefaultEventsMap, DefaultEventsMap>'.ts(2339)
的io.sockets.disconnect()
。
你知道该如何处理这件事吗?
发布于 2021-04-11 08:44:32
我认为在socket初始化中可能存在问题。您能尝试一下这种在https://socket.io/get-started/chat#Integrating-Socket-IO中显示的初始化吗?
const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
const io = require('socket.io')(server);
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
io.on('connection', (socket) => {
console.log('a user connected');
});
server.listen(3000, () => {
console.log('listening on *:3000');
});
因此,基本上将服务器对象从socket.io中传递给默认导入,就像这样(现在,您正在socket.io中使用" server“):
import express from "express";
import cors from "cors";
import ioDefault, { Server, Socket } from "socket.io";
import { createServer } from "http";
import morgan from "morgan";
// App configuration
const app = express();
const server = createServer(app);
const io = ioDefault(server);
const port = process.env.PORT || 8080;
// Middlewares
app.use(cors());
app.use(express.json());
app.use(morgan("combined"));
// ...
更新:
问题是在同一端口上运行的另一台服务器。若要检查在特定端口上运行的进程,请执行以下操作
netstat -anpe | grep "8080" | grep "LISTEN"
如果netstat未安装,则在基于debian的系统中运行sudo apt install net-tools
(ubuntu、fedora等)
然后,您可以用它的pid杀死它:
kill -9 5454
https://stackoverflow.com/questions/67042921
复制相似问题