Services

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。Implement patch additionally to update if you want to separate between partial and full updates and support the PATCH 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.

你可能感兴趣的:(Services)