Services

作者: RayRoad | 来源:发表于2016-02-17 11:46 被阅读0次

    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 providersreal-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

          本文链接:https://www.haomeiwen.com/subject/qglpkttx.html