使用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
相关产品推荐
相关产品推荐

