LoopBack

作者: Daeeman | 来源:发表于2020-12-16 17:33 被阅读0次

1. 工具(Tools)

  • Postman
    [图片上传失败...(image-af870d-1608111192578)]
  • heidisql

[图片上传失败...(image-d858e-1608111192578)]

2. 安装

验证是否已安装依赖项

python --version   应该是2.7.x
node --version     应该是v0.10.x或v0.12.x。
npm --version      应该是1.x或2.x。

安装LoopBack 4 CLI

npm i -g @loopback/cli

安装StrongLoop

npm install -g strongloop

验证安装

slc -v

3. 创建一个简单的API

3.1 . 建立新的应用程式

如果使用的是IBM API Connect工具,则命令为:

$ apic loopback

如果使用StrongLoop工具:

cd loopback  //进入项目文件的存放目录

$ slc loopback


//? 您的应用程序的名称是什么? loopback_test2
//? 输入目录名称以包含项目: (loopback_test2) Run-async wrapped function (sync) returned a promise but async() callback must be executed to resolve.
//? 输入目录名称以包含项目: loopback_test2
//   create loopback_test2/
//     info 将工作目录更改为 loopback_test2

//? 您想要使用哪个版本的 LoopBack? 2.x (长期支持)
//? 您想要什么种类的应用程序? api-server (A LoopBack API server with local User auth)
//正在生成 .yo-rc.json

//I'm all done. Running npm install for you to install the required dependencies. If this //fails, try running the command yourself.

//   create .editorconfig
//   create .eslintignore
//   create .eslintrc
//   create server\boot\root.js
//   create server\middleware.development.json
//   create server\middleware.json
//   create server\server.js
//   create README.md
//   create server\boot\authentication.js
//   create .gitignore
//   create client\README.md

LoopBack生成器将以友好的ASCII艺术欢迎您,并提示您输入应用程序的名称

cd loopback_test2

3.2. 建立模型Create models

现在,您已经完成了初始项目的脚手架,接下来将创建一个 Coffeeshop 模型,该模型将自动具有REST API端点。

$ cd loopback_test2

然后,使用IBM API Connect开发人员工具箱:

$ apic create --type model

或者,使用StrongLoop工具:

$ slc loopback:model

//? 请输入模型名称: CoffeeShop
//? 选择要向其附加 CoffeeShop 的数据源: db (memory)
//? 选择模型的基类 PersistedModel
//? 通过 REST API 公开 CoffeeShop? Yes
//? 定制复数形式(用于构建 REST URL): Y
//? 公共模型或仅服务器? 公共
//现在添加一些 CoffeeShop 属性。

//在完成时输入空的属性名称。
//? 属性名称: Run-async wrapped function (sync) returned a promise but async() callback must //be executed to resolve.
//? 属性名称: name
//   invoke   loopback:property
//? 属性类型: string
//? 是否为必需? No
//? 缺省值[对于无,保留为空白]: Y

//下面添加另一个 CoffeeShop2 属性。
//Run-async async() called outside a valid run-async context, callback will be ignored.
//在完成时输入空的属性名称。
//? 属性名称: city
//   invoke   loopback:property
//? 属性类型: string
//? 是否为必需? No
//? 缺省值[对于无,保留为空白]:

//下面添加另一个 CoffeeShop2 属性。
//Run-async async() called outside a valid run-async context, callback will be ignored.
//在完成时输入空的属性名称。
//? 属性名称:

//D:\loopback\loopback_test2>

3.3. 运行

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

4. 使用API资源管理器

https://loopback.io/doc/en/lb2/Use-API-Explorer.html

用get、post等方法操作数据

设置数据不可见

server/model-config.json

"public": true       // true不公开fale公开

5. Data Source

将API连接到数据源

安装MySQL连接器

现在添加loopback-connector-mysql模块并安装依赖项:

$ npm install loopback-connector-mysql --save

添加数据源

npm i loopback-connector-mysql@^2.2

现在,您将使用数据源生成器来定义数据源 :

slc loopback:datasource

输入 mysqlDs 并点击 Enter

? 请输入数据源名称: mariaD
? 为 mariaD 选择连接器: MySQL (StrongLoop 支持)
特定于连接器的配置:
? Connection String url to override other settings (eg: mysql://user:pass@host/db):
? host: 127.0.0.1
? port: 3306
? user: root
? password: ****
? database: dason
? 安装 loopback-connector-mysql@^2.2 (Y/n) Run-async wrapped function (sync) returned a promise but async() callback must be executed to resolve.
? 安装 loopback-connector-mysql@^2.2 Yes
+ loopback-connector-mysql@2.4.1
added 5 packages from 12 contributors in 6.643s

11 packages are looking for funding
  run `npm fund` for details

D:\loopback\loopback_test2>

将CoffeeShop模型连接到MySQL

现在,您已经创建了一个MySQL数据源,并且有一个CoffeeShop模型。您只需要连接它们。LoopBack应用程序使用 model-config.json 文件将模型链接到数据源。编辑 /server/model-config.json 并查找CoffeeShop条目:

/server/model-config.json

...
  "CoffeeShop": {
    "dataSource": "db",
    "public": true
  }
  ...

dataSource 属性从 更改 dbmysqlDs。这会将CoffeeShop模型附加到您刚刚创建和配置的MySQL数据源:

/server/model-config.json

...
  "CoffeeShop": {
    "dataSource": "mysqlDs",
    "public": true
  }
...

添加一些测试数据并查看

server/boot/create-sample-models.js

module.exports = function(app) {
  app.dataSources.mariaDs.automigrate('CoffeeShop', function(err) {
    if (err) throw err;

    app.models.CoffeeShop.create([{
      name: 'Bel Cafe',
      city: 'Vancouver'
    }, {
      name: 'Three Bees Coffee House',
      city: 'San Mateo'
    }, {
      name: 'Caffe Artigiano',
      city: 'Vancouver'
    }, ], function(err, coffeeShops) {
      if (err) throw err;

      console.log('Models created: \n', coffeeShops);
    });
  });
};

这会将一些测试数据保存到数据源。

注意: 但如果重新运行,create-sample-models.js数据会重新覆盖而重置数据

6. 扩展您的API

coffee-shop.js 添加

module.exports = function(CoffeeShop) {
  CoffeeShop.status = function(cb) {
    var currentDate = new Date();
    var currentHour = currentDate.getHours();
    var OPEN_HOUR = 6;
    var CLOSE_HOUR = 20;
    console.log('Current hour is %d', currentHour);
    var response;
    if (currentHour >= OPEN_HOUR && currentHour < CLOSE_HOUR) {
      response = 'We are open for business.';
    } else {
      response = 'Sorry, we are closed. Open daily from 6am to 8pm.';
    }
    cb(null, response);
  };
  CoffeeShop.remoteMethod(
    'status', {
      http: {
        path: '/status',
        verb: 'get'
      },
      returns: {
        arg: 'status',
        type: 'string'
      }
    }
  );
};
module.exports = function(CoffeeShop) {
...
  CoffeeShop.getName = function(shopId, cb) {
    CoffeeShop.findById( shopId, function (err, instance) {
        var response = "Name of coffee shop is " + instance.name;
        cb(null, response);
        console.log(response);
    });
  }
...
  CoffeeShop.remoteMethod (
        'getName',
        {
          http: {path: '/getname', verb: 'get'},
          accepts: {arg: 'id', type: 'string', http: { source: 'query' } },
          returns: {arg: 'name', type: 'string'}
        }
    );
}

添加远程方法

  1. coffee-shop.js 在您喜欢的编辑器中打开 。默认情况下,它包含一个空函数:

    module.exports = function(CoffeeShop) {};
    
  2. 向此函数添加以下代码,以使用远程方法扩展模型的行为,因此看起来如下所示:

    module.exports = function(CoffeeShop) {
      CoffeeShop.status = function(cb) {
        var currentDate = new Date();
        var currentHour = currentDate.getHours();
        var OPEN_HOUR = 6;
        var CLOSE_HOUR = 20;
        console.log('Current hour is %d', currentHour);
        var response;
        if (currentHour >= OPEN_HOUR && currentHour < CLOSE_HOUR) {
          response = 'We are open for business.';
        } else {
          response = 'Sorry, we are closed. Open daily from 6am to 8pm.';
        }
        cb(null, response);
      };
      CoffeeShop.remoteMethod(
        'status', {
          http: {
            path: '/status',
            verb: 'get'
          },
          returns: {
            arg: 'status',
            type: 'string'
          }
        }
      );
    };
    
  3. 保存文件

尝试远程方法

  1. 返回应用程序的根目录,运行该应用程序:

    $ node .

  2. 转到

    http:// localhost:3000 / explorer

    查看API Explorer。然后单击CoffeeShops,您将看到有一个新的REST端点,

    GET/CoffeeShop/status
    

    该端点 调用远程方法。

    [图片上传失败...(image-63046b-1608111192578)]</ figure>

  3. 单击

    尝试!

    您将看到调用远程方法的结果:

    {
      "status": "Open for business."
    }
    

这就是使用LoopBack添加远程方法非常容易!

有关更多信息,请参见 远程方法

7. 添加静态网页

https://loopback.io/doc/en/lb2/Add-a-static-web-page.html

定义静态中间件

接下来,您需要定义静态中间件来提供目录中的 /client 文件。 添加以下内容:

server / middleware.json

...
"files": {
  "loopback#static": {
    "params": "$!../client" 
  }
},
...

这些行定义了 静态中间件 ,该中间件使应用程序将目录中的 /client 文件作为静态内容提供。该 $! 字符表示该路径是相对的位置 middleware.json

添加一个HTML文件

现在,该应用程序将把您放入/client 目录中的任何文件 作为静态(客户端)内容。因此,要查看实际效果,请向中添加一个HTML文件 /client。例如,添加一个index.html 具有以下内容的文件 :

/client/index.html

<head><title>LoopBack</title></head>
<body>
    <h1>LoopBack Rocks!</h1>
    <p>Hello World... </p>
</body>

当然,您可以添加任何喜欢的静态HTML –这只是一个示例。

运行…

现在再次运行该应用程序:

$ node .

立即加载 http://0.0.0.0:3000/ index而不是状态JSON时,您将看到以下内容:

[图片上传失败...(image-8f65b1-1608111192578)]</ figure>

8. 模型关系

• HasMany

• BelongsTo

• HasOne

• HasManyThrough

HasMany

建立在與其他模型「一對多」的連結,此關係表示模型的每個實例都具有零個或多個對應的模型實例。Ex. 每位會員可有多筆留言。

9. 创建新模型

该应用程序具有三个模型:

它们之间的关系如下:

  • 一个CoffeeShop有很多评论
  • 一个CoffeeShop有很多评论者
  • 评论属于CoffeeShop
  • 评论属于评论者
  • 评论者有很多评论

定义审阅模型

输入:

$ slc loopback:model

出现提示时,输入或选择以下内容:

? 请输入模型名称: Review
? 选择要向其附加 Review 的数据源: mariaDs (mysql)
? 选择模型的基类 PersistedModel
? 通过 REST API 公开 Review? Yes
? 定制复数形式(用于构建 REST URL):
? 公共模型或仅服务器? 公共
现在添加一些 Review 属性。

在完成时输入空的属性名称。
? 属性名称: Run-async wrapped function (sync) returned a promise but async() callback must be executed to resolve.
? 属性名称: date
   invoke   loopback:property
? 属性类型: date
? 是否为必需? Yes
? 缺省值[对于无,保留为空白]:

//下面添加另一个 Review 属性。
//Run-async async() called outside a valid run-async //context, callback will be ignored.
在完成时输入空的属性名称。
? 属性名称: rating
   invoke   loopback:property
? 属性类型: number
? 是否为必需? No
? 缺省值[对于无,保留为空白]:
//下面添加另一个 Review 属性。
//Run-async async() called outside a valid run-async //context, callback will be ignored.
在完成时输入空的属性名称。
? 属性名称: comments
   invoke   loopback:property
? 属性类型: string
? 是否为必需? Yes
? 缺省值[对于无,保留为空白]:

下面添加另一个 Review 属性。
Run-async async() called outside a valid run-async context, callback will be ignored.
在完成时输入空的属性名称。
? 属性名称:

D:\loopback\loopback_test1>

查看模型JSON文件

现在,看common/models/review.json

然后,按照提示添加这些属性:

Property name Property type Required?
date date y
rating number n
comments string y

要退出模型生成器,请在提示输入属性名称时按RETURN。

输入:

slc loopback:model

出现提示时,输入或选择以下内容:

? 请输入模型名称: Reviewer
? 选择要向其附加 Reviewer 的数据源: mariaDs (mysql)
? 选择模型的基类 User
? 通过 REST API 公开 Reviewer? Yes
? 定制复数形式(用于构建 REST URL):
? 公共模型或仅服务器? 公共
现在添加一些 Reviewer 属性。

在完成时输入空的属性名称。
? 属性名称: Run-async wrapped function (sync) returned a promise but async() callback must be executed to resolve.
? 属性名称:无

安装异步 async

npm install --save async

服务器/启动/创建样本模型.js

var async = require('async');
module.exports = function(app) {
  //data sources
  var mariaDs = app.dataSources.mariaDs;
  //var mysqlDs = app.dataSources.mysqlDs;
  //create all models
  async.parallel({
    reviewers: async.apply(createReviewers),
    coffeeShops: async.apply(createCoffeeShops),
  }, function(err, results) {
    if (err) throw err;
    createReviews(results.reviewers, results.coffeeShops, function(err) {
      console.log('> models created sucessfully');
    });
  });
  //create reviewers
  function createReviewers(cb) {
    mariaDs.automigrate('Reviewer', function(err) {
      if (err) return cb(err);
      var Reviewer = app.models.Reviewer;
      Reviewer.create([{
        email: 'foo@bar.com',
        password: 'foobar'
      }, {
        email: 'john@doe.com',
        password: 'johndoe'
      }, {
        email: 'jane@doe.com',
        password: 'janedoe'
      }], cb);
    });
  }
  //create coffee shops
  function createCoffeeShops(cb) {
    mariaDs.automigrate('CoffeeShop', function(err) {
      if (err) return cb(err);
      var CoffeeShop = app.models.CoffeeShop;
      CoffeeShop.create([{
        name: 'Bel Cafe',
        city: 'Vancouver'
      }, {
        name: 'Three Bees Coffee House',
        city: 'San Mateo'
      }, {
        name: 'Caffe Artigiano',
        city: 'Vancouver'
      }, ], cb);
    });
  }
  //create reviews
  function createReviews(reviewers, coffeeShops, cb) {
    mariaDs.automigrate('Review', function(err) {
      if (err) return cb(err);
      var Review = app.models.Review;
      var DAY_IN_MILLISECONDS = 1000 * 60 * 60 * 24;
      Review.create([{
        date: Date.now() - (DAY_IN_MILLISECONDS * 4),
        rating: 5,
        comments: 'A very good coffee shop.',
        publisherId: reviewers[0].id,
        coffeeShopId: coffeeShops[0].id,
      }, {
        date: Date.now() - (DAY_IN_MILLISECONDS * 3),
        rating: 5,
        comments: 'Quite pleasant.',
        publisherId: reviewers[1].id,
        coffeeShopId: coffeeShops[0].id,
      }, {
        date: Date.now() - (DAY_IN_MILLISECONDS * 2),
        rating: 4,
        comments: 'It was ok.',
        publisherId: reviewers[1].id,
        coffeeShopId: coffeeShops[1].id,
      }, {
        date: Date.now() - (DAY_IN_MILLISECONDS),
        rating: 4,
        comments: 'I go here everyday.',
        publisherId: reviewers[2].id,
        coffeeShopId: coffeeShops[2].id,
      }], cb);
    });
  }
};

10. 定义模型关系

引入模型关系

环回支持许多不同类型的模型关系,包括:属于关联的hasManyHasManyThroughHasAndBelongsToMany,等等。有关更多信息,请参见 创建模型关系

在“ Coffee Shop评论”应用程序中,模型之间的关系如下:

  • 一个咖啡店有很多评论。
  • 一个咖啡店有很多评论者。
  • 评论属于一家咖啡店。
  • 评论属于评论者。
  • 评论者有很多评论。

定义关系

slc loopback:relation

选择

? 选择从中创建关系的模型: CoffeeShop
? 关系类型: has many
? 选择与之创建关系的模型: Review
? 输入关系的属性名称: reviews
? (可选)输入定制外键:
? 需要直通模型? No
? 选择从中创建关系的模型: Review
? 关系类型: belongs to
? 选择与之创建关系的模型: CoffeeShop
? 输入关系的属性名称: coffeeShop
? (可选)输入定制外键:
? 选择从中创建关系的模型: Review
? 关系类型: belongs to
? 选择与之创建关系的模型: Reviewer
? 输入关系的属性名称: reviewer
? (可选)输入定制外键:
? 选择从中创建关系的模型: Reviewer
? 关系类型: has many
? 选择与之创建关系的模型: Review
? 输入关系的属性名称: reviews
? (可选)输入定制外键:
? 需要直通模型? No
? 选择从中创建关系的模型: CoffeeShop
? 关系类型: has many
? 选择与之创建关系的模型: Reviewer
? 输入关系的属性名称: reviewers
? (可选)输入定制外键:
? 需要直通模型? No

11. 定义访问控制

$ slc loopback:acl
? 选择要应用 ACL 条目的模型: Review
? 选择 ACL 作用域: 所有方法和属性
? 选择访问类型: All (match all types)
? 选择角色 All users
? 选择要应用的许可权 Explicitly deny access

所有人都可以看,不可以改

? 选择要应用 ACL 条目的模型: Review
? 选择 ACL 作用域: 所有方法和属性
? 选择访问类型: All (match all types)
? 选择角色 All users
? 选择要应用的许可权 Explicitly grant access

授权的可以

? 选择要应用 ACL 条目的模型: Review
? 选择 ACL 作用域: 单个方法
? 输入方法名称 create
? 选择角色 Any authenticated user
? 选择要应用的许可权 Explicitly grant access

物件所有者可修改

? 选择要应用 ACL 条目的模型: Review
? 选择 ACL 作用域: 所有方法和属性
? 选择访问类型: Write
? 选择角色 The user owning the object
? 选择要应用的许可权 Explicitly grant access

12. 创建AngularJS客户端

相关文章

网友评论

      本文标题:LoopBack

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