LoopBack 从入门到放弃(二)正确的打开方式

书接上文,先说一说 LoopBack 的脚手架,虽然比较友好,但是还是有其局限,打一个不恰当的比方,就好像是用 DreamWeaver 来写 HTML 页面,虽然很方便,但是不能精细的控制细微的部分。

所以 LoopBack 脚手架可以用,但要在明白其原理的前提下,做到触类旁通。下面就介绍一下脚手架生成的文件结构:

.
+-- client //客户端代码
+-- common
|   +-- models //数据模型
|   |    +-- person.js //person 数据逻辑
|   |    +-- person.json //person 数据结构
+-- node_modules //依赖
+-- server //服务端代码
|   +-- boot
|   |    +-- authentication.js //启动时的初始化操作
|   |    +-- root.js //路由文件
|   +-- component-config.json
|   +-- config.json
|   +-- datasource.json //数据库配置
|   +-- middleware.development.json
|   +-- middleware.json
|   +-- model-config.json //数据模型的数据
|   +-- server.js //程序入口
+-- .editorconfig
+-- .eslintignore
+-- .eslintrc
+-- .gitignore
+-- .yo-rc.json
+-- package-lock.josn
+-- package.josn
+-- README.md

服务器端的核心无非是数据结构,那我们开看看上节所定义的数据 person,脚手架给我生成了哪些文件,做了哪些改动。

你可能已经猜到了, common/models 下的 person.jsperson.json 了,首先打开person.js:

'use strict';

module.exports = function(Person) {

};

发现业务逻辑是空的,没错,但是这并不代表 person 这个模型没有任何方法。person 默认继承自 PersistedModel,里面包含了 REST 所需要的各种 API,这个文件在我们需要特殊处理的时候来编辑。然后是person.json

{
  "name": "person",
  "plural": "people",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "firstname": {
      "type": "string",
      "required": true
    },
    "lastname": {
      "type": "string",
      "required": true
    }
  },
  "validations": [],
  "relations": {},
  "acls": [],
  "methods": {}
}

会发现它的 base 属性为 PersistedModel,同时也会发现 properties 里面包含了我们在脚手架里生成的firstnamelastname,到现在为止逐渐有些眉目了,也就是说,以后我们数据结构有了变动,可以直接在这个文件里修改其properties即可。那么如果我们新添加数据结构直接添加类似的这两个文件就可以了吗?其实不然。让我们来打开model-config.json文件:

{
  "_meta": {
    "sources": [
      "loopback/common/models",
      "loopback/server/models",
      "../common/models",
      "./models"
    ],
    "mixins": [
      "loopback/common/mixins",
      "loopback/server/mixins",
      "../common/mixins",
      "./mixins"
    ]
  },
  "User": {
    "dataSource": "db"
  },
  "AccessToken": {
    "dataSource": "db",
    "public": false
  },
  "ACL": {
    "dataSource": "db",
    "public": false
  },
  "RoleMapping": {
    "dataSource": "db",
    "public": false,
    "options": {
      "strictObjectIDCoercion": true
    }
  },
  "Role": {
    "dataSource": "db",
    "public": false
  },
  "person": {
    "dataSource": "db",
    "public": true
  }
}

会发现在最下面有 person 属性,里面包含了 dataSource 和 public,dataSource 顾名思义,是数据源,在这里是直接使用内存模拟的数据库,详细的会在以后介绍。public 代表这个 API 是否公开,设置为 false,则代表无法通过默认的 url 来进行增删改查改。

脚手架添加一个新的数据模型主要新增修改这三个地方。

另外我们发现除了 person 外还有很多预定义数据结构,这是因为 Loopback 已经为我们内置了了用户、角色系统,我想这也是大部分系统所必须的。

目前为止,我们已经了解到只需我们定义数据模型,LoopBack 就会为我们提供强大的 RESTAPI 功能,其实我们业务逻辑远比 RESTAPI 提供的增删改查复杂,这个时候就需要我们订制 API 了。LoopBack 也提供订制 API 的支持,打开 server\boot\root.js

'use strict';

module.exports = function(server) {
  // Install a `/` route that returns server status
  var router = server.loopback.Router();
  router.get('/', server.loopback.status());
  server.use(router);
};

了解 express 可能会对上面的代码比较熟悉,其实 LoopBack 也是基于 Express.js 的,这就意味着你可以使用 express js 的路由功能以及生态库的各种中间件,编写更复杂的 API。

今天就先介绍到这里。