LoopBack3.0最佳实践(二)——快速构建

本文的内容为通过Loopback的脚手架工具快速构建一个hello world应用程序,并初步了解Model、数据源等核心概念。当然,快速上手LoopBack,官方的文档是最权威的最丰富的,英文基础好的朋友可以出门左转搭乘官方的公交车:

不想看英文的懒人朋友请留步,我们继续,本文的可读性更好,而且代码可以到Github下载。

1. 安装CLI

LoopBack的快速打开方式为安装命令行脚手架工具LoopBack CLI。在安装Node.js之后,有两种安装CLI的方法:

1. npm install -g loopback-cli (仅安装LoopBack CLI,交互命令为`lb`)
2. npm install -g apiconnect (安装API Connect开发套件,可以用`apic loopback`这个命令启动LoopBack CLI)

这两种方式安装的LoopBack CLI,具体的交互命令基本相同,会有一些微小的差别。本文仅以介绍LoopBack为目的,所以将采用loopback-cli作为示例。关于LoopBack和API Connect之间的关系可参见本系列的第一篇文章《初识LoopBack》

2. 创建hello world应用

仅需在命令行键入lb这个命令,就可以按照交互式的提示去创建一个LoopBack应用。我们用loopback-hello-world作为工程的名字:

$ lb
? What's the name of your application? loopback-hello-world
? Enter name of the directory to contain the project: loopback-hello-world

? Which version of LoopBack would you like to use? 3.x (current)

在选择工程类型的时候,有4种选项

What kind of application do you have in mind? (Use arrow keys)
❯ api-server (A LoopBack API server with local User auth) 
  empty-server (An empty LoopBack API, without any configured models or datasources) 
  hello-world (A project containing a controller, including a single vanilla Message and a single remote method) 
  notes (A project containing a basic working example, including a memory database)
  • empty-server 只包含基本的LoopBack脚手架代码
  • api-server 在empty-server的基础上,增加了用户认证的一些配置
  • hello-world 在api-server基础上,增加了一个Message模型,用于演示Model的作用
  • notes 在api-server基础上,增加了一个Note模型,与hello-world的区别在于多了一些默认的REST API

这里我们选择hello-world,回车之后CLI会创建下面这些基本的文件,并且自动安装了所有package.json中的依赖包:

.
├── client
│   └── README.md
├── node_modules
├── common
│   └── models
│       ├── message.js
│       └── message.json
├── package.json
└── server
    ├── boot
    │   ├── authentication.js
    │   └── root.js
    ├── component-config.json
    ├── config.json
    ├── datasources.json
    ├── middleware.development.json
    ├── middleware.json
    ├── model-config.json
    └── server.js

然后启动应用程序

$ node .
Web server listening at: http://localhost:3000
Browse your REST API at http://localhost:3000/explorer

访问localhost:3000根路径,返回的是一行关于应用程序运行状态的信息,工程里并没有定义前端页面。

{"started":"2017-10-04T06:33:55.674Z","uptime":5.538}

访问localhost:3000/explorer则是一个Swagger页面,LoopBack称之为Explorer

直接在页面上操作,访问后端预定义好的REST API,给输入参数赋值后,点击try it out可返回结果

3. 解构hello world工程

首先来看一下loopback-hello-world的工程目录结构

.
├── client                          --> 存放前端代码
│   └── README.md
├── node_modules                    
├── common                          --> 存放前端和后端共用的代码
│   └── models                        --> 存放Model配置文件和定义文件 
│       ├── message.js                  --> 定义message这个Model暴露的Rest方法
│       └── message.json                --> 定义message这个Model的相关属性
├── package.json                    --> 定义依赖库
└── server                          --> 存放后端代码
    ├── boot                          --> 存放引导脚本,当LoopBack应用程序启动时,会按字母顺序加载引导脚本
    │   ├── authentication.js           --> 控制是否启用应用程序的身份验证,默认为启用
    │   └── root.js                     --> 配置应用程序的根路由,即访问'/'时返回的结果
    ├── component-config.json       --> 定义应用程序需要的Loopback组件
    ├── config.json                 --> 定义应用程序的基本配置,如API前缀、占用端口等
    ├── datasources.json            --> 定义数据源
    ├── middleware.json             --> 定义默认使用的中间件
    ├── middleware.development.json --> 定义在development环境下使用的中间件。多个运行环境可以有不同的配置
    ├── model-config.json           --> 定义应用程序中Model的加载路径,以及具体Model的数据源  
    └── server.js                   --> 应用程序启动脚本

工程里的代码和配置文件主要围绕着模型(Model)、数据源(Datasource)、中间件(Middleware)、组件(Component)这些概念来定义,我们来认识一下Looback的“四大金刚“:

  • Model
    在Loopback的世界里,一个Model不仅仅是Property的集合,还可以提供REST API Endpoint方法,并且集成ORM功能。开发者仅需要定义Property和配置参数,Loopback会自动集成API和数据持久化方法。一个Model由模型配置文件(xxx.json)和模型定义文件(xxx.js)组成。
  • Datasource
    Loopback里的Datasource,不仅仅可以是Mysql、Oracle等数据库,也可以是Web Service,还可以是MQ、RPC、Email等服务。Model和Datasource绑定,可以将数据持久化到任何地方。
  • Middleware
    由于Loopback基于Express完成http路由,其中间件的概念与Express Middleware的概念一致,是一个在Http请求的响应周期中执行的JavaScript函数,在API Endpoint方法之前或之后调用。类似于Java中的拦截器(interceptor)。
  • Component
    组件是Loopback提供的用于与第三方服务集成的插件机制,目前支持的组件有消息推送(Push notifications)、云存储(Storage component)、第三方认证(Third-party login)、Swagger等。这些插件都是独立的Nodejs Module,需要安装后才能被应用程序调用。

4. 添加Model

定义一个Model仅仅需要在命令行键入lb model,然后跟随其交互指令:

? Enter the model name: 
(注:定义Model名称)

? Select the datasource to attach CoffeeShop to: (Use arrow keys)
❯ db (memory) 
  (no datasource) 
(注:选择Model绑定的数据源。由于我们没有定义数据源,所以这里只能先选择内存)

? Select model's base class (Use arrow keys)
  Model 
❯ PersistedModel 
  ACL 
  AccessToken 
  Application 
  Change 
  Checkpoint 
(注:选择父类。这里有7种Loopback内嵌Model,我们可以先选择最常用的PersistedModel)

? Expose CoffeeShop via the REST API? (Y/n) 
(注:是否暴露REST API接口)

? Custom plural form (used to build REST URL): CoffeeShop
(注:自定义Model名称的复数形式。会用于定义API的URL。上一步选择Y时,会进入这一步,否则直接下一步)

? Common model or server only? (Use arrow keys)
❯ common 
  server
(注:Model是否需要被前后端共用。Loopback的工程是前后端一体的,选择common时,Model的相关代码会被放在一个Common的路径下,更容易被前端调用)

然后定义Model的属性

Enter an empty property name when done.
(注:下面的交互命令是个循环,直接回车可退出)

? Property name: 
(注:属性名称)

? Property type: (Use arrow keys)
❯ string 
  number 
  boolean 
  object 
  array 
  date 
  buffer 
(Move up and down to reveal more choices)
(注:选择属性类型)

? Required? (y/N)
(注:是否必需)

? Default value[leave blank for none]:
(注:默认值,可不设定)

我们在工程中添加一个新的Model,咖啡店 - CoffeeShop,包含name和city两个字段


定义完之后,我们可以看到代码有了如下的变化

  • 修改了server/model-config.json
      "CoffeeShop": {
      "dataSource": "db",
      "public": true
    }
    
  • 新增了common/models/coffee-shop.js和common/models/coffee-shop.json
    {
      "name": "CoffeeShop",
      "plural": "CoffeeShop",
      "base": "PersistedModel",
      "idInjection": true,
      "options": {
        "validateUpsert": true
      },
      "properties": {
        "name": {
          "type": "string",
          "required": true
        },
        "city": {
          "type": "string",
          "required": true
        }
      },
      "validations": [],
      "relations": {},
      "acls": [],
      "methods": {}
    }
    

后面我们会看到所有新建的Model一般都会有这两个文件,Model配置文件(xxx.json)中可以配置一个Model的基本属性,Model定义文件(xxx.js)中可以添加Model的自定义方法,该文件不是必需,即在没有自定义方法的情况下也可以不需要Model定义文件。所以如果想手动创建一个Model,可以直接创建Model定义文件Model配置文件,同时修改model-config.json即可。

好了,重启应用程序,我们可以看到Loopback自动为我们集成了各种增删改查的REST方法,目前数据只能持久化到内存。


5. 添加数据源

命令行键入lb datasource,跟随其交互命令:

? Enter the datasource name:
(注:定义Datasource名称)

? Select the connector for mysql: (Use arrow keys)
❯ In-memory db (supported by StrongLoop) 
  In-memory key-value connector (supported by StrongLoop) 
  IBM Object Storage (supported by StrongLoop) 
  IBM DB2 (supported by StrongLoop) 
  IBM DashDB (supported by StrongLoop) 
  IBM MQ Light (supported by StrongLoop) 
  IBM Cloudant DB (supported by StrongLoop) 
  Cassandra (supported by StrongLoop) 
  Redis key-value connector (supported by StrongLoop) 
  MongoDB (supported by StrongLoop) 
  MySQL (supported by StrongLoop) 
  PostgreSQL (supported by StrongLoop) 
  Oracle (supported by StrongLoop) 
  Microsoft SQL (supported by StrongLoop)
(注:海量数据库任你选择)

? Connection String url to override other settings
(注:根据不同的数据库设置不同的连接参数)

这里我们可以用Loopback官方提供的demo数据库作为示例

? Enter the datasource name: mysql
? Select the connector for mysql: MySQL (supported by StrongLoop)
? Connection String url to override other settings (eg: mysql://user:pass@host/db): 
? host: demo.strongloop.com
? port: 3306
? user: demo
? password: L00pBack
? database: getting_started
? Install loopback-connector-mysql@^2.2 Yes

定义完之后的代码变化:

  • 修改了package.json。添加对loopback-connector-mysql的依赖,并自动安装。
    "loopback-connector-mysql": "^2.4.1",
    
  • 修改了server/datasources.json。添加了对mysql数据源的配置。
    "mysql": {
      "host": "demo.strongloop.com",
      "port": 3306,
      "url": "",
      "database": "getting_started",
      "password": "L00pBack",
      "name": "mysql",
      "user": "demo",
      "connector": "mysql"
    }
    

在model-config.js中,将我们的CoffeShop的数据源修改为新增的mysql

  "CoffeeShop": {
    "dataSource": "mysql",
    "public": true
  }

然后即可重启应用程序。如果可以正常连接数据源,我们可以查询到数据库的CoffeeShop数据,其他的API大家可以自己去体验。


ok,到这里我们已经成功地构建了一个LoopBack的应用,区区几行代码,就让我们成功地实现了一个REST服务,从API到数据库一条龙。更多关于Model的玩法,欢迎访问本系列的下一篇文章《面向Model编程》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容