Socket.io

npm version Changelog

$ npm install @feathersjs/socketio --save

The @feathersjs/socketio module allows to call 服务 and receive 事件 via Socket.io, a NodeJS library which enables real-time bi-directional, event-based communication.

重要

本页介绍如何设置Socket.io服务器. :doc:`./client/socketio`显示如何在客户端连接到此服务器以及服务调用和实时事件的消息格式.

配置

``@feathersjs/socketio``可以单独使用, 也可以与Feathers框架集成一起使用, 例如 Express.

app.configure(socketio())

使用由以下命令提供的服务器设置Socket.io传输 application_listen 或传入 application_setup.

const feathers = require('@feathersjs/feathers');
const socketio = require('@feathersjs/socketio');

const app = feathers();

app.configure(socketio());

app.listen(3030);

小技巧

一旦服务器启动了 app.listen()app.setup(server), Socket.io对象就可以作为 app.io 使用.

app.configure(socketio(callback))

使用默认配置设置Socket.io传输, 并使用 Socket.io服务器对象 调用 callback.这是一个听取自定义事件或添加 authorization 的好地方:

const feathers = require('@feathersjs/feathers');
const socketio = require('@feathersjs/socketio');

const app = feathers();

app.configure(socketio(function(io) {
  io.on('connection', function(socket) {
    socket.emit('news', { text: 'A client connected!' });
    socket.on('my other event', function (data) {
      console.log(data);
    });
  });

  // Registering Socket.io middleware
  io.use(function (socket, next) {
    // Exposing a request property to services and hooks
    socket.feathers.referrer = socket.request.referrer;
    next();
  });
}));

app.listen(3030);

app.configure(socketio(options [, callback]))

使用给定的 Socket.io选项对象 设置Socket.io传输, 并可选择调用上述回调.

这可以用于例如配置Socket.io初始化的路径(默认情况下为 socket.io/).以下更改了 ws/ 的路径:

const feathers = require('@feathersjs/feathers');
const socketio = require('@feathersjs/socketio');

const app = feathers();

app.configure(socketio({
  path: '/ws/'
}, function(io) {
  // Do something here
  // This function is optional
}));

app.listen(3030);

app.configure(socketio(port, [options], [callback]))

在单独的端口上创建新的Socket.io服务器.选项和回调是可选的, 并按上述方式工作.

const feathers = require('@feathersjs/feathers');
const socketio = require('@feathersjs/socketio');

const app = feathers();

app.configure(socketio(3031));
app.listen(3030);

params

Socket.io中间件 可以修改 socket 上的 feathers 属性, 然后使用它作为服务调用 params:

app.configure(socketio(function(io) {
  io.use(function (socket, next) {
    socket.feathers.user = { name: 'David' };
    next();
  });
}));

app.use('messages', {
  create(data, params, callback) {
    // When called via SocketIO:
    params.provider // -> socketio
    params.user // -> { name: 'David' }
  }
});

注解

socket.feathers 与a 事件频道 中的 connection 是同一个对象. socket.requestsocket.handshake 包含发起连接的HTTP请求的信息(参见 Socket.io documentation).

params.provider

For any 服务 made through Socket.io params.provider will be set to socketio. In a 钩子 this can for example be used to prevent external users from making a service method call:

app.service('users').hooks({
  before: {
    remove(context) {
      // check for if(context.params.provider) to prevent any external call
      if(context.params.provider === 'socketio') {
        throw new Error('You can not delete a user via Socket.io');
      }
    }
  }
});

params.query

params.query 将包含从客户端发送的查询参数.

重要

服务器和客户端之间只传递 params.query, 而 params 的其他部分则没有.这是出于安全原因, 因此客户端无法设置 params.user 或数据库选项.你总是可以从 params.query 映射到:doc:./ hooks.

params.connection

params.connection 是可以与 事件频道 一起使用的连接对象. 它与Socket.io中间件中的 socket.feathers 是相同的对象, 如 params 部分<#params>`_所示.