Services是每个Feathers应用的心脏。一个service就是一个简单的JavaScript对象,它提供一个或多个find
, get
, create
, update
, remove
以及setup
的服务方法,并且可以像Express 中间件一样使用 app.use('/path', serviceObject)
.
让我们通过一个简单的service和REST provider来创建一个Feathers应用:
// app.js
const feathers = require('feathers');
const rest = require('feathers-rest');
const app = feathers();
app.configure(rest());
app.use('/todos', {
get(id, params) {
return Promise.resolve({
id,
params,
description: `You have to do ${id}!`
});
}
});
app.listen(3030);
接着我们来运行它
$ npm install feathers feathers-rest
$ node app.js
我们通过浏览器打开localhost:3030/todos/dishes后,你将看到如下结果:
{
"id": "dishes",
"description": "You have to do dishes!",
"params": {
"provider": "rest",
"query": {}
}
}
加一个参数试试,就像这样localhost:3030/todos/dishes?name=David,我们会看到如下的结果:
{
"id": "dishes",
"description": "You have to do dishes!",
"params": {
"provider": "rest",
"query": {
"name": "David"
}
}
}
引用services
当我们通过app.use('/my-service', myService)
注册service的时候, Feathers为myService这个对象创建了一个浅拷贝并为扩充了它的功能. 这意味着这个服务继承了Feathers的方法(real-time events, hooks......). 我们可以使用app.service
来引用这个服务:
const todos = app.service('todos');
// 我们也可以给它加上 前/后斜杠
const todos = app.service('/todos/');
// 通过如下方法使用这个服务
todos.get('laundry').then(todo => console.log(todo.description));
重要: 原始的service对象并不会被改变,并且永远不会继承Feathers的功能。
Service 方法
完整的service方法列表如下:
const myService = {
find(params [, callback]) {},
get(id, params [, callback]) {},
create(data, params [, callback]) {},
update(id, data, params [, callback]) {},
patch(id, data, params [, callback]) {},
remove(id, params [, callback]) {},
setup(app, path) {}
}
app.use('/my-service', myService);
使用ES6 class(类)方式定义如下:
'use strict';
class MyService {
find(params [, callback]) {}
get(id, params [, callback]) {}
create(data, params [, callback]) {}
update(id, data, params [, callback]) {}
patch(id, data, params [, callback]) {}
remove(id, params [, callback]) {}
setup(app, path) {}
}
app.use('/my-service', new MyService());
Service方法需要返回一个Promise对象并且具有下列参数:
-
id
资源标识符,每个资源都是拥有唯一的ID的数据。 -
data
指代资源数据。 -
params
可以包含任何额外的参数, 例如用户验证.params.query
包含来自客户端的查询参数 (参考 REST providers 和 real-time providers)。 -
callback
是一个可选的回掉函数,可以被一个 Promise 替代. 它是一个节点式回调函数,该函数遵循function(error, result) {}
。
这些方法基本上映射了CRUD接口:
-
find(params [, callback])
检索来自服务端的所有资源,Provider的参数将通过params.query
进行传递。 -
get(id, params [, callback])
通过指定的id
从服务器中检索单一资源。 -
create(data, params [, callback])
用data
创建一个新的资源。这个方法将返回一个包含新创建的数据的Promise。data
也可能是一个数组,它将创建并返回一个资源列表. -
update(id, data, params [, callback])
用新的data
替换原来标识为id
资源。这个方法会返回一个包含着完整的更新资源数据的Promise。当更新多条数据时id
也可以为空null
. -
patch(id, data, params [, callback])
将新的data
与标识为id
的现有资源合并为新的数据。 合并多个资源时id
可以为空null
。这个方法会返回一个包含着完整的更新资源数据的Promise。Implementpatch
additionally toupdate
if you want to separate between partial and full updates and support thePATCH
HTTP method. -
remove(id, params [, callback])
通过id
标识删除资源数据. 这个方法将返回一个包含被删除资源的Promise. 删除多个资源时id
可以为空null
。
setup
方法
setup(app, path)
通过一个Feathers应用的实例和一个已注册的路径来初始化service。使用setup
是用来连接服务器的好方法:
// app.js
'use strict';
const feathers = require('feathers');
const rest = require('feathers-rest');
class TodoService {
get(id, params) {
return Promise.resolve({
id,
description: `You have to ${id}!`
});
}
}
class MyService {
setup(app) {
this.app = app;
}
get(name, params) {
const todos = this.app.service('todos');
return todos.get('take out trash')
.then(todo => {
return { name, todo };
});
}
}
const app = feathers()
.configure(rest())
.use('/todos', new TodoService())
.use('/my-service', new MyService())
app.listen(8000);
你可以通过访问localhost:8000/my-service/test这个地址来查看以上代码的结果。
事件(Events)
Any registered service will automatically turn into an event emitter that emits events when a resource has changed,
当资源发生改变时,任何已注册的服务会自动转变为一个事件发射器来执行发送事件。这个改变包含 create
, update
, patch
或这是 remove
service call returned successfully. 如果你想了解更多关于事件(events)的信息, 请访问如下章节 real-time events.
网友评论