2016-11-15 2 views
1

Мы пытаемся соединить, чтобы расширить нашу машинопись приложение на основе inversify-экспресс-Utils с WebSockets, но не повезло до сих пор:Использование inversify-express-utils, как я могу интегрировать 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 plugin и выполнение \connect localhost:3000. Любая идея?

+0

Привет, я сообщил этот вопрос к команде InversifyJS и мы исследуем его на https://github.com/inversify/InversifyJS/issues/413 мы еще никогда использовать веб-сокеты с экспресс-утилитами, прежде чем, возможно, это недостающая функция, но я буду держать вас в курсе. –

+0

Спасибо за ваш ответ. Я буду следовать [InversifyJS/issues/413] (http://github.com/inversify/InversifyJS/issues/413) –

ответ

3

У меня есть аналогичная проблема некоторое время назад. Вот что работал для меня:

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; 

Как вы можете видеть, вы должны создать работающий экземпляр вашего экспресс-сервера, прежде чем вы можете прикрепить Socket.io к нему. Недостаточно переменной server. Надеюсь, это сработает для вас.

С наилучшими пожеланиями
.... Simon

+0

Можете подтвердить, что это решение работает. Благодаря! –

2

Рабочий пример можно найти на https://github.com/dkellenb/inversify-express-utils-websockets Вопрос был:

  • обертка Сервер должен быть создан вокруг приложения
  • Listen должны быть начато на экспресс-сервере
  • Строка тестового соединения должна выглядеть так:
    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); 
Смежные вопросы