Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Socket.io在服务器刷新/关闭时保持连接_Node.js_Typescript_Express_Socket.io - Fatal编程技术网

Node.js Socket.io在服务器刷新/关闭时保持连接

Node.js Socket.io在服务器刷新/关闭时保持连接,node.js,typescript,express,socket.io,Node.js,Typescript,Express,Socket.io,在我不熟悉套接字的前提下,我正在尝试在服务器上设置第一个配置(节点w/Express) 在执行此操作时,我遇到了一个问题,每次保存时nodemon都会崩溃,返回错误:listen-EADDRINUSE:address-ready-in-use:::8080 以下是服务器实现: 从“express”导入express; 从“cors”导入cors; 从“Socket.io”导入{Server,Socket}; 从“http”导入{createServer}; 从“摩根”进口摩根; //应用程序配置

在我不熟悉套接字的前提下,我正在尝试在服务器上设置第一个配置(节点w/Express)

在执行此操作时,我遇到了一个问题,每次保存时nodemon都会崩溃,返回
错误:listen-EADDRINUSE:address-ready-in-use:::8080

以下是服务器实现:

从“express”导入express;
从“cors”导入cors;
从“Socket.io”导入{Server,Socket};
从“http”导入{createServer};
从“摩根”进口摩根;
//应用程序配置
常量app=express();
const server=createServer(应用程序);
const io=新服务器(服务器);
const port=process.env.port | | 8080;
//中间商
应用程序使用(cors());
使用(express.json());
应用程序使用(摩根(“合并”);
//插座连接
io.on(“连接”,插座:插座)=>{
socket.send(“测试”);
});
服务器。侦听(端口,()=>{
log(`Server已启动并在${process.env.NODE_env}-port${port}`上运行);
});
我认为这是因为socket.io连接从未关闭/断开,服务器实例处于侦听状态

我环顾四周,发现许多q/a建议使用命令来查找和终止进程,但我需要一种解决方案,能够在每次express服务器被关闭时自动断开套接字

我尝试了以下方法:

io.on(“断开连接”),()=>{
io.sockets.disconnect();
}
正如所建议的,但是TS抱怨类型“Namespace”上不存在带有
属性“disconnect”的
io.sockets.disconnect()


你知道应该如何解决这个问题吗?

我认为套接字io初始化可能有问题。你能尝试一下如下所示的这种初始化方式吗:

const express=require('express');
常量app=express();
const http=require('http');
const server=http.createServer(app);
const io=require('socket.io')(服务器);
应用程序获取(“/”,(请求,请求)=>{
res.sendFile(uu dirname+'/index.html');
});
io.on('连接',(套接字)=>{
log(“已连接的用户”);
});
服务器。听(3000,()=>{
console.log('监听*:3000');
});
因此,基本上是这样将服务器对象从socket io传递到默认导入(现在,您正在socket.io中使用“server”):

更新:

问题是另一台服务器在同一端口上运行。要检查哪个进程在特定端口上运行,可以运行

netstat-anpe | grep“8080”| grep“LISTEN”

如果未安装netstat,请在基于debian的系统(ubuntu、fedora和其他)中运行
sudo apt install net tools

然后可以使用其pid杀死它:


kill-9 5454

我尝试了一下,但不幸的是,代码似乎包含完全相同的问题(要触发错误,请尝试在服务器上复制代码,然后添加一个console.log(),保存,删除console.log(),然后再次保存)-我使用了您的第一个版本(ES6),但我猜第二个也会有相同的行为。第一个代码取自链接的socket io网站,并不打算直接与您的代码一起使用。我用他们文档中提供的代码完全替换了我的代码,我刚才测试的内容没有任何自定义。当我认为有遗留服务器时正在端口8080上运行。请尝试查找并终止它,或者重新启动电脑。不,我指的是代码以外的其他服务器。通常,您应该能够在express服务器上运行socket.io服务器,如文档所示。
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"));
// ...