“服务”是每个Feathers应用程序的核心.服务是JavaScript对象(或 ES6类 的实例), 它们实现 服务方式. Feathers本身也会为其服务添加一些 services_feathers-functional.
服务方法是预定义的 CRUD 方法, 您的服务对象可以实现(或已经由以下其中一个实现的方法 通用API. 下面是Feathers 服务接口 的完整示例, 作为普通的JavaScript对象, 返回一个 Promise 或使用 async/await:
const myService = {
find(params) {
return Promise.resolve([]);
},
get(id, params) {},
create(data, params) {},
update(id, data, params) {},
patch(id, data, params) {},
remove(id, params) {},
setup(app, path) {}
}
app.use(‘/my-service’, myService);
const myService = {
async find(params) { return []; },
async get(id, params) {},
async create(data, params) {},
async update(id, data, params) {},
async patch(id, data, params) {},
async remove(id, params) {},
setup(app, path) {}
}
app.use(‘/my-service’, myService);
服务也可以是 ES6类 的实例:
class MyService {
find(params) { return Promise.resolve([]); }
get(id, params) {}
create(data, params) {}
update(id, data, params) {}
patch(id, data,params) {}
remove(id, params) {}
setup(app, path) {}
}
app.use(‘/my-service’, new MyService());
class MyService {
async find(params) { return []; }
async get(id, params) {}
async create(data, params) {}
async update(id, data, params) {}
async patch(id, data, params) {}
async remove(id, params) {}
setup(app, path) {}
}
app.use(‘/my-service’, new MyService());
小技巧
方法是可选的, 如果没有实现方法, Feathers会自动发出 NotImplemented 错误.
重要
始终使用 app.service(path) 返回的服务, 而不是服务对象(上面的 myService 对象).有关更多信息, 请参阅 app.service文档.
服务方法必须返回一个 Promise 或者声明为 async 和有以下参数:
id — 资源的标识符.资源是由唯一ID标识的数据.
data — 资源数据.
params - 方法调用的其他参数, 请参阅 params
注册后, 可以通过 app.service() 检索和使用该服务:
const myService = app.service('my-service');
myService.find().then(items => console.log('.find()', items));
myService.get(1).then(item => console.log('.get(1)', item));
请记住, 服务不必使用数据库.您可以使用使用某些API的软件包轻松替换示例中的数据库, 例如, 引入GitHub星标或股票代码数据.
重要
本节介绍服务方法的一般用法以及如何实现它们.它们已由官方Feathers数据库适配器实现.有关如何使用数据库适配器的详细信息, 请参阅 通用API.
params 包含服务方法调用的附加信息. “params” 中的一些属性可以由Feathers设置.常用的有:
params.query - 来自客户端的查询参数, 或者作为URL查询参数传递(参见 Express 章节)或者通过websockets传递(参见 Socket.io 或 Primus).
params.provider - 用于此服务调用的传输(rest, socketio 或 primus).对于来自服务器的内部调用, 将是 undefined (除非明确传递).
认证 或明确传递.
params.connection - 如果服务调用是通过实时传输(例如通过websockets)进行的, params.connection 是可以使用的连接对象 事件频道.
重要
对于外部调用, 只有 params.query 将在客户端和服务器之间发送.如果没有通过, params.query 对于内部调用将是 undefined.
service.find(params) - > Promise - 从服务中检索所有资源的列表. Provider参数将作为 params.query 传递.
app.use('/messages', {
find(params) {
return Promise.resolve([
{
id: 1,
text: 'Message 1'
}, {
id: 2,
text: 'Message 2'
}
]);
}
});
注解
find 不必返回一个数组;它也可以返回一个对象.数据库适配器已经为 pagination 执行此操作.
service.get(id, params) -> Promise - 从服务中检索具有给定“id”的单个资源.
app.use('/messages', {
get(id, params) {
return Promise.resolve({
id,
text: `You have to do ${id}!`
});
}
});
service.create(data, params) - > Promise - 使用 data 创建一个新资源.该方法应该使用新创建的数据返回“Promise”. data 也可以是一个数组.
app.use('/messages', {
messages: [],
create(data, params) {
this.messages.push(data);
return Promise.resolve(data);
}
});
重要
一个成功的 create 方法调用会发出 created 服务事件.
service.update(id, data, params) - > Promise - 用 data 替换 id 标识的资源.该方法应该返回一个带有完整, 更新的资源数据的“Promise”.更新多个记录时, id 也可以是 null, params.query 包含查询条件.
重要
一个成功的 update 方法调用会发出 updated 服务事件.
patch(id, data, params) - > Promise - 将 id 标识的资源的现有数据与新的 data 合并. id 也可以是 null, 表示应该用包含查询条件的 params.query 修补多个资源.
该方法应返回完整的更新资源数据.如果你想区分部分和完全更新并支持 PATCH HTTP方法, 另外(或代替) update 实现 patch.
重要
一个成功的 patch 方法调用会发出 patched 服务事件.
service.remove(id, params) - > Promise - 用 id 删除资源.该方法应该返回一个带有已移除资源的 Promise. id 也可以是 null, 表示删除多个资源, params.query 包含查询条件.
重要
一个成功的 remove 方法调用会发出 removed 服务事件.
对于在调用 app.listen 之前注册的服务, 当调用 app.listen 时, 会调用每个注册服务的 setup 函数.对于在调用 app.listen 之后注册的服务, Feathers会在注册服务时自动调用 setup.
对于在调用 app.listen 之前注册的服务, 在调用 app.listen 时调用每个注册服务的 setup 函数.对于在调用 app.listen 之后注册的服务, 在注册服务时, Feathers会自动调用 setup.
setup 是一个使用任何特殊配置初始化服务的好地方, 或者如果连接紧密耦合的服务(见下文), 而不是使用 hooks/readme.
// app.js
'use strict';
const feathers = require('@feathersjs/feathers');
const rest = require('@feathersjs/express/rest');
class MessageService {
get(id, params) {
return Promise.resolve({
id,
read: false,
text: `Feathers is great!`,
createdAt: new Date.getTime()
});
}
}
class MyService {
setup(app) {
this.app = app;
}
get(name, params) {
const messages = this.app.service('messages');
return messages.get(1)
.then(message => {
return { name, message };
});
}
}
const app = feathers()
.configure(rest())
.use('/messages', new MessageService())
.use('/my-service', new MyService())
app.listen(3030);
注册服务时, Feathers(或其插件)也可以将自己的方法添加到服务中.最值得注意的是, 每个服务都将自动成为 NodeJS EventEmitter 的实例.
由核心 NodeJS EventEmitter .on 提供.为给定的 eventname 注册一个 listener 方法(function(data){}).
重要
有关服务事件的更多信息, 请参阅 事件.
核心 NodeJS EventEmitter .emit 提供.将事件 eventname 发送给所有事件侦听器.
重要
有关服务事件的更多信息, 请参阅 事件.
核心 NodeJS EventEmitter .removeListener 提供.为 eventname 删除所有监听器或给定的监听器.
重要
有关服务事件的更多信息, 请参阅 事件.