事件

事件是Feathers实时功能的关键部分. Feathers中的所有事件都通过 NodeJS EventEmitter interface提供.本节介绍

重要

有关如何向客户端发送实时事件的更多信息,请参阅 事件频道.

EventEmitters

一旦注册,任何 服务 变成标准的 NodeJS EventEmitter 并且可以相应地使用.

const messages = app.service('messages');

// Listen to a normal service event
messages.on('patched', message => console.log('message patched', message));

// Only listen to an event once
messsages.once('removed', message =>
  console.log('First time a message has been removed', message)
);

// A reference to a handler
const onCreatedListener = message => console.log('New message created', message);

// Listen `created` with a handler reference
messages.on('created', onCreatedListener);

// Unbind the `created` event listener
messages.removeListener('created', onCreatedListener);

// Send a custom event
messages.emit('customEvent', {
  type: 'customEvent',
  data: 'can be anything'
});

服务事件

当相应的服务方法成功返回时,任何服务都会自动发出 created, updated, patchchedremoved 事件.这适用于客户端以及服务器.当客户端使用 Socket.ioPrimus 时,事件将自动从服务器推送到所有连接的客户端.这实际上是Feathers实时的方式.

小技巧

直到你的所有 钩子 都被执行后才会触发事件.

重要

有关如何发布这些事件以实现对已连接客户端的实时更新的信息,请参阅 事件频道.

除了事件 data 之外,所有事件还从它们作为第二个参数传递的方法调用中得到 钩子上下文.

created

当服务 create 成功返回时, created 事件将触发结果数据.

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

app.use('/messages', {
  create(data, params) {
    return Promise.resolve(data);
  }
});

// Retrieve the wrapped service object which will be an event emitter
const messages = app.service('messages');

messages.on('created', (message, context) => console.log('created', message));

messages.create({
  text: 'We have to do something!'
});

updated, patched

当服务 updatepatch 方法成功回调时, updatedpatched 事件将使用回调数据触发.

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

app.use('/my/messages/', {
  update(id, data) {
    return Promise.resolve(data);
  },

  patch(id, data) {
    return Promise.resolve(data);
  }
});

const messages = app.service('my/messages');

messages.on('updated', (message, context) => console.log('updated', message));
messages.on('patched', message => console.log('patched', message));

messages.update(0, {
  text: 'updated message'
});

messages.patch(0, {
  text: 'patched message'
});

removed

当服务 remove 成功回调时, removed 事件将使用回调数据触发.

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

app.use('/messages', {
  remove(id, params) {
    return Promise.resolve({ id });
  }
});

const messages = app.service('messages');

messages.on('removed', (message, context) => console.log('removed', message));
messages.remove(1);

自定义事件

默认情况下,实时客户端只接收 标准事件.但是,可以将服务上的自定义事件列表定义为 service.events,当服务器上调用 service.emit('customevent',data) 时,也应该传递这些事件.自定义事件的 context 不是一个完整的钩子上下文,而只是一个包含 {app,service,path,result} 的对象.

重要

自定义事件只能从服务器发送到客户端,而不是其他方式(客户端到服务器). 学到更多

例如,在处理付款时向客户端发送状态事件的付款服务可能如下所示:

class PaymentService {
  constructor() {
    this.events = ['status'];
  },

  create(data, params) {
    createStripeCustomer(params.user).then(customer => {
      this.emit('status', { status: 'created' });
      return createPayment(data).then(result => {
        this.emit('status', { status: 'completed' });
      });
    });
  }
}

通用API 也将自定义事件列表作为 初始化选项:

const service = require('feathers-<adaptername>'); // e.g. `feathers-mongodb`

app.use('/payments', service({
  events: [ 'status' ],
  Model
});

使用 service.emit 自定义事件也可以在钩子中发送:

app.service('payments').hooks({
  after: {
    create(context) {
      context.service.emit('status', { status: 'completed' });
    }
  }
});

Custom events can be 出版 just like standard events and listened to it in a 监听事件.

client.service('payments').on('status', data => {});

socket.on('payments status', data => {});