我已经搜索了几天,但仍然没有找到任何替代方法,或者在尝试写TypeScript声明时也没有帮忙。
https://www.npmjs.com/package/express-ws
重要的是,它可以与其他任何快递路线一起使用。身份验证,角色和路径参数。
express-ws的键入现在为created。
tests显示如何使用它:
import expressWs from 'express-ws';
const { app, getWss, applyTo } = expressWs(express());
或:
const app = expressWs(express()).app;
例如,然后在声明路由而不是写时:
const myRoutes = function(app: Express) {...}
您需要指定express-ws类型:
import expressWs from 'express-ws';
const myRoutes = function(app: expressWs.Application) {...}
唯一的问题是Router
类型没有ws(...)
方法。添加
export interface RouterWs extends express.Router {
ws (route: string, ...cb): RouterWs;
}
然后在获取Router
时,将其强制转换为您的类型。
const router = express.Router() as RouterWs;
router.ws('/somepath', (ws, req) => {...
我一直在为xterm.js(v3)项目尝试相同的方法,该项目将其demo / app.js替换为我们的需求和TypeScript。我偶然发现了这篇“如何做”的文章,看起来像是一个有前途的替代方法:WebSocket + Node.js + Express-使用Typescript的逐步教程:
https://medium.com/factory-mind/websocket-node-js-express-step-by-step-using-typescript-725114ad5fe4
感谢Derek Hill和Normunds Kalnberzins
与路由器配合使用效果更好
首次导入快递-ws
import expressWs from 'express-ws';
要使用ws
方法,您需要加强表达(我这样理解)
const { app, getWss, applyTo } = expressWs(express());
之后express.Router
包含ws
方法,但是打字稿的类型错误,您只需要转换类型即可。
const router = express.Router() as expressWs.Router;
定义路由逻辑
router.ws('/echo', (ws, req) => {
ws.on('message', (msg: String) => {
ws.send(msg);
});
});
最后将router
添加到快递app
app.use("/ws-stuff", router);