事件¶
事件是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, patchched 和 removed 事件.这适用于客户端以及服务器.当客户端使用 Socket.io 或 Primus 时,事件将自动从服务器推送到所有连接的客户端.这实际上是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¶
当服务 update 或 patch 方法成功回调时, updated 和 patched 事件将使用回调数据触发.
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' });
});
});
}
}
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 => {});