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

使用express-ws为Express路由创建WebSocket端点时遇TypeError问题

解决TypeError: router.ws is not a function问题

错误原因

你使用express.Router()创建的路由对象并未被express-ws模块增强,该模块默认仅为Express应用实例(app)添加ws方法,普通路由对象不具备WebSocket端点定义能力,因此触发此错误。

解决方案

方案一:使用express-ws增强版Router

修改data.route.ts文件,替换普通路由对象为express-ws提供的增强版Router,这样路由对象会自带ws方法:

import express from 'express';
import expressWs from 'express-ws';
import dataController from '../controllers/data.controller.js';
import authMiddleware from '../middlewares/auth.middleware.js';

// 创建被express-ws增强的路由实例
const router = expressWs.Router();

router.use(authMiddleware);

// 现在可以正常定义WebSocket端点
router.ws('/ws/tradebars', (ws, req) => {
  // 示例:监听客户端消息并回复
  ws.on('message', (message) => {
    console.log('收到客户端消息:', message);
    ws.send(`已收到消息:${message}`);
  });

  // 连接建立时发送欢迎消息
  ws.send('WebSocket连接已建立');
});

export default router;

方案二:在入口文件中为路由绑定WebSocket支持

如果你希望继续使用普通express.Router(),可以在入口文件中显式将路由与express-ws关联,为其添加WebSocket能力:

修改index.ts,在挂载路由前添加以下代码:

// 初始化express-ws(保留原代码此步骤)
const { app, getWss } = expressWs(express());

// 导入路由后,为路由绑定WebSocket支持
import data from './routes/data.route.js';
expressWs(app, data);

// 正常挂载路由
app.use('/api/data', data);

额外检查

  • 确保已正确安装依赖:执行npm install express-ws确认模块已安装
  • 验证Express与express-ws版本兼容性,建议使用最新稳定版

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:35:03