2016-12-22 46 views
0

我想用js + primus羽毛來設置websocket:https://docs.feathersjs.com/real-time/primus.html。 但我不知道如何從服務器端的primus得到spark實例。以下是我的服務器代碼:如何使用feathersjs-primus來設置websocket連接

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

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

在上面的代碼中,服務器可以從create()方法中的客戶端獲取消息。但是,我怎麼能從primus中得到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'}) 

什麼wr與上面的代碼?

回答

0

理想情況下,您不會直接在您的服務中使用套接字連接。服務不應該知道它是如何被訪問的。有兩個選項:

  • 設置併發送自己的事件在app.configure(primus(
  • 有服務發出自己的custom events

-

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

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

我試過,但服務器無法接收來自客戶端的消息。我上面發佈了我的代碼。 –

+0

目前這隻能將事件從服務器發送到客戶端。如果你想從客戶端發送信息到服務器,你必須使用'create','update','patch'或'remove'服務方法,這就是他們的用途。 – Daff