Как использовать Feathersjs-Primus для настройки соединения с веб-сокетом

Я пытаюсь настроить websocket с помощью перьев js + primus, следующих по этой ссылке: https://docs.feathersjs.com/real-time/primus.html. Но я не знаю, как получить экземпляр Spark от примуса на стороне сервера. Ниже мой код сервера:

  class SocketService {
      create(data, params, callback){
          ...
      }
  }

module.exports = function(){
  const app = this
  let ss = new SocketService()
  app.use('socket-shell', ss);
}

В приведенном выше коде сервер может получить сообщение от клиента в методе create (). Но как я могу получить экземпляр Spark от примуса в этом методе? Я хочу использовать метод spark.write для отправки сообщения клиенту.

Ниже приведен код сервера для настройки сервисов перьев:

app
  .use(compress())
  .options('*', cors())
  .use(cors())
  // .use(favicon(path.join(app.get('public'), 'favicon.ico')))
  .use('/', serveStatic(app.get('public')))
  .use(bodyParser.json())
  .use(bodyParser.urlencoded({extended: true}))
  .configure(hooks())
  .configure(rest())
  .configure(primus({
    transformer: 'websockets',
    timeout: false,
  }, (primus) => {
    app.use('socket-shell', function(socket, done){
      // Exposing a request property to services and hooks
      socket.request.feathers.referrer = socket.request.referrer;
      done();
    });
  }))
  .configure(services)
  .configure(middleware);

Приведенный ниже код используется для регистрации прослушивателя событий на стороне сервера, но он не может получать событие от клиента:

class SocketService {

  constructor(options) {

    this.events = [ 'someevent','serverevent' ]

  }

  setup(app) {
    this.app = app;

    let socketService = app.service('socket-shell')
    socketService.addListener('serverevent', this.serverevent)
  }

  serverevent(msg){
    console.log('serverevent', msg)
  }

В клиентском коде я использую приведенный ниже код для отправки сообщения на сервер:

var primus = new Primus('http://localhost:3030');
  var app = feathers()
    .configure(feathers.hooks())
    .configure(feathers.primus(primus));

  var messageService = app.service('/socket-shell');
messageService.emit('serverevent', {msg:'this is client'})

что не так с приведенным выше кодом?


person Joey Yi Zhao    schedule 22.12.2016    source источник


Ответы (1)


В идеале вы бы не использовали сокетное соединение непосредственно в своей службе. Сервис не должен знать, как к нему обращаются. Есть два варианта:

  • Создавайте и отправляйте собственные события в app.configure(primus(
  • Служба должна генерировать собственные настраиваемые события.

--

class SocketService {
  constructor() {
    this.events = [ 'someevent' ];
  }

  create(data, params, callback){
      this.emit('someevent', 'data');
  }
}
person Daff    schedule 22.12.2016
comment
Я пробовал это, но сервер не может получить сообщение от клиента. Я разместил свой код выше. - person Joey Yi Zhao; 23.12.2016
comment
В настоящее время это работает только при отправке событий с сервера клиенту. Если вы хотите отправлять информацию от клиента на сервер, вы должны использовать методы обслуживания create, update, patch или remove, для чего они нужны. - person Daff; 23.12.2016