简体   繁体   English

如何使用Feathers.js-primus设置WebSocket连接

[英]How to use feathersjs-primus to setup websocket connection

I am trying to setup websocket by feathers js + primus following from this link: https://docs.feathersjs.com/real-time/primus.html . 我正在尝试通过此链接通过羽毛js + primus设置websocket: https : //docs.feathersjs.com/real-time/primus.html But I don't know how to get spark instance from primus in server side. 但是我不知道如何从服务器端的primus获取spark实例。 Below is my server code: 下面是我的服务器代码:

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

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

In above code, server can get the message from client in create() method. 在上面的代码中,服务器可以通过create()方法从客户端获取消息。 But how can I get spark instance from primus in that method? 但是,如何通过这种方法从primus获取spark实例? I want to use spark.write method to send message back to the client. 我想使用spark.write方法将消息发送回客户端。

Below is the server code for configuring feathers services: 以下是用于配置羽毛服务的服务器代码:

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);

Below code is used to registering a event listener on server side but it can't receive event from client: 以下代码用于在服务器端注册事件侦听器,但无法从客户端接收事件:

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)
  }

In client code, I use below code to emit message to server: 在客户端代码中,我使用以下代码向服务器发送消息:

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'})

what wrong with above code? 上面的代码有什么问题?

Ideally you wouldn't use the socket connection directly in your service. 理想情况下,您不会在服务中直接使用套接字连接。 A service shouldn't know about how it is being accessed. 服务不应该知道如何访问它。 There are two options: 有两种选择:

  • Set up and send your own events in app.configure(primus( app.configure(primus(
  • Have the service emit its own custom events 让服务发出自己的自定义事件

-- -

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

  create(data, params, callback){
      this.emit('someevent', 'data');
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM