You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS@v9集成socketio-jwt构建报错:找不到SocketIO命名空间

问题:SocketIO-JWT类型依赖缺失导致TS编译错误

我正在开发带聊天功能的NestJS@v9项目,需要在创建WebSocket时通过用户发送的token做授权。项目构建脚本为"build":"npm run remove-build && tsc -p tsconfig.build.json",执行yarn build时出现以下错误:

yarn run build stdout:
$ npm run remove-build && tsc -p tsconfig.build.json

> remove-build
> rm -rf dist

../../node_modules/socketio-jwt/types/index.d.ts(26,14): error TS2503: Cannot find namespace 'SocketIO'.
../../node_modules/socketio-jwt/types/index.d.ts(63,38): error TS2503: Cannot find namespace 'SocketIO'.

移除// import { authorize } from 'socketio-jwt';后错误消失,但我必须使用该authorize方法完成授权逻辑。


相关依赖信息

package.json中的相关依赖:

"socket.io": "^4.5.2",
    "socket.io-redis": "^6.1.1",
    "socketio-jwt": "^4.6.2",

客户端连接代码

const socket = io('http://localhost:1080', {
  transports: ['websocket'],
  query: {
    token: TOKEN,
  },
});

服务端授权代码

import { authorize } from 'socketio-jwt';

public createIOServer(port: number, options?: ServerOptions): any {
  const server = super.createIOServer(port, options);

  server.adapter(this.redisAdapter);
  server.use(
    authorize({
      decodedPropertyName: 'token',
      handshake: true,
      secret: secret,
    }) as any,
  );
}

解决方案

方案1:安装SocketIO类型声明包

socketio-jwt的类型定义依赖SocketIO的全局类型,但项目未引入该类型。执行以下命令安装缺失的开发依赖:

npm install @types/socket.io --save-dev
# 或使用yarn
yarn add @types/socket.io --dev

安装完成后重新执行yarn build即可解决类型缺失问题。

方案2:在tsconfig中显式引入类型

如果安装类型包后仍报错,可在tsconfig.json的compilerOptions中添加socket.io类型:

{
  "compilerOptions": {
    // 其他配置项...
    "types": ["socket.io"]
  }
}

方案3:替换为官方维护的@socket.io/jwt(推荐)

socketio-jwt已停止维护,官方推荐使用@socket.io/jwt替代,步骤如下:

  1. 卸载旧包:
npm uninstall socketio-jwt
# 或
yarn remove socketio-jwt
  1. 安装新包:
npm install @socket.io/jwt
# 或
yarn add @socket.io/jwt
  1. 修改服务端代码:
import { authenticate } from "@socket.io/jwt";

public createIOServer(port: number, options?: ServerOptions): any {
  const server = super.createIOServer(port, options);

  server.adapter(this.redisAdapter);
  server.use(
    authenticate({
      secret: secret,
      decodedPropertyName: "token",
    })
  );
}

客户端代码无需修改,新包会自动从query参数中提取token完成验证。

内容的提问来源于stack exchange,提问作者Mohammed Ibrahim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:15:47