使用 inversify-express-utils,如何集成 websockets?
Using inversify-express-utils, how can i integrate websockets?
我们尝试连接以扩展基于 inversify-express-utils 的 typescript 应用程序和 websockets,但到目前为止没有运气:
import 'reflect-metadata';
import {interfaces, InversifyExpressServer, TYPE} from 'inversify-express-utils';
import { Kernel } from 'inversify';
import {UserController} from './controller/UserController';
import TYPES from './constant/types';
import * as socketIo from 'socket.io';
// set up kernel
let kernel = new Kernel();
// create server
let server = new InversifyExpressServer(kernel);
kernel.bind<interfaces.Controller>(TYPE.Controller).to(UserController).whenTargetNamed(TAGS.UserController);
server
.build()
.listen(3000, 'localhost', () => console.log('listening on http://localhost:3000'));
// try to setup a socket io based websocket
let io = socketIo(server);
io.on('connect', (socket) => console.log('"connect" executed'));
io.on('connection', (socket) => console.log('"connection" executed'));
服务器按预期启动 ts-node server.ts
。
但是我无法连接到这个网络套接字。尝试使用多种工具,例如 Dark WebSocket Terminal chrome 插件和执行 \connect localhost:3000
。
有什么想法吗?
我前段时间遇到过类似的问题。这是对我有用的:
let server: interfaces.InversifyExpressServer = new InversifyExpressServer(kernel);
server.setConfig((app) => {
...
app.use(helmet());
...
});
let app = server.build();
let instance: any = app.listen(config.url.port);
console.log(`Server started on port ${config.url.port} :)`);
let socketIO = SocketIO.listen(instance);
socketIO.on('connection', (socket: SocketIO.Server) => {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data: any) {
console.log(data);
});
});
exports = module.exports = app;
如您所见,您必须先创建 express 服务器的 运行 实例,然后才能将 Socket.IO 附加到它上面。您的 server
变量还不够。我希望这对你有用。
此致
....西蒙
可以在 https://github.com/dkellenb/inversify-express-utils-websockets 上找到一个工作示例问题是:
- 需要围绕应用程序创建服务器包装器
- 应在 express 服务器上启动侦听
- 测试连接字符串应如下所示:
ws://localhost:3000/socket.io/?EIO=3&transport=websocket
代码片段:
// server.build() actually returns an Express.Application instance
let app = server.build();
// socket.io expects an http.Server versus a InversifyExpressServer
// see http://socket.io/docs/#using-with-express-3/4
let httpServer = require('http').createServer(app);
httpServer.listen(3000);
// create socket.io
let io = socketIo(httpServer);
import * as express from 'express';
import * as expressWs from 'express-ws';
import { InversifyExpressServer } from 'inversify-express-utils';
import { container } from "./utils/InversifyConfig";
let inversifyExpressServer = new InversifyExpressServer(container);
inversifyExpressServer.setConfig((app: expressWs.Application) => {
expressWs(app);
// Your other config
});
我们尝试连接以扩展基于 inversify-express-utils 的 typescript 应用程序和 websockets,但到目前为止没有运气:
import 'reflect-metadata';
import {interfaces, InversifyExpressServer, TYPE} from 'inversify-express-utils';
import { Kernel } from 'inversify';
import {UserController} from './controller/UserController';
import TYPES from './constant/types';
import * as socketIo from 'socket.io';
// set up kernel
let kernel = new Kernel();
// create server
let server = new InversifyExpressServer(kernel);
kernel.bind<interfaces.Controller>(TYPE.Controller).to(UserController).whenTargetNamed(TAGS.UserController);
server
.build()
.listen(3000, 'localhost', () => console.log('listening on http://localhost:3000'));
// try to setup a socket io based websocket
let io = socketIo(server);
io.on('connect', (socket) => console.log('"connect" executed'));
io.on('connection', (socket) => console.log('"connection" executed'));
服务器按预期启动 ts-node server.ts
。
但是我无法连接到这个网络套接字。尝试使用多种工具,例如 Dark WebSocket Terminal chrome 插件和执行 \connect localhost:3000
。
有什么想法吗?
我前段时间遇到过类似的问题。这是对我有用的:
let server: interfaces.InversifyExpressServer = new InversifyExpressServer(kernel);
server.setConfig((app) => {
...
app.use(helmet());
...
});
let app = server.build();
let instance: any = app.listen(config.url.port);
console.log(`Server started on port ${config.url.port} :)`);
let socketIO = SocketIO.listen(instance);
socketIO.on('connection', (socket: SocketIO.Server) => {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data: any) {
console.log(data);
});
});
exports = module.exports = app;
如您所见,您必须先创建 express 服务器的 运行 实例,然后才能将 Socket.IO 附加到它上面。您的 server
变量还不够。我希望这对你有用。
此致
....西蒙
可以在 https://github.com/dkellenb/inversify-express-utils-websockets 上找到一个工作示例问题是:
- 需要围绕应用程序创建服务器包装器
- 应在 express 服务器上启动侦听
- 测试连接字符串应如下所示:
ws://localhost:3000/socket.io/?EIO=3&transport=websocket
代码片段:
// server.build() actually returns an Express.Application instance
let app = server.build();
// socket.io expects an http.Server versus a InversifyExpressServer
// see http://socket.io/docs/#using-with-express-3/4
let httpServer = require('http').createServer(app);
httpServer.listen(3000);
// create socket.io
let io = socketIo(httpServer);
import * as express from 'express';
import * as expressWs from 'express-ws';
import { InversifyExpressServer } from 'inversify-express-utils';
import { container } from "./utils/InversifyConfig";
let inversifyExpressServer = new InversifyExpressServer(container);
inversifyExpressServer.setConfig((app: expressWs.Application) => {
expressWs(app);
// Your other config
});