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
属性从 更改 db
为 mysqlDs
。这会将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'}
}
);
}
添加远程方法
-
coffee-shop.js
在您喜欢的编辑器中打开 。默认情况下,它包含一个空函数:module.exports = function(CoffeeShop) {};
-
向此函数添加以下代码,以使用远程方法扩展模型的行为,因此看起来如下所示:
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' } } ); };
-
保存文件
尝试远程方法
-
返回应用程序的根目录,运行该应用程序:
$ node .
-
转到
http:// localhost:3000 / explorer
查看API Explorer。然后单击CoffeeShops,您将看到有一个新的REST端点,
GET/CoffeeShop/status
该端点 调用远程方法。
[图片上传失败...(image-63046b-1608111192578)]</ figure>
-
单击
尝试!
您将看到调用远程方法的结果:
{ "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(在LoopBack入门中定义 )
- 评论
- 审稿人
它们之间的关系如下:
- 一个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. 定义模型关系
引入模型关系
环回支持许多不同类型的模型关系,包括:属于关联,的hasMany,HasManyThrough和HasAndBelongsToMany,等等。有关更多信息,请参见 创建模型关系。
在“ 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
网友评论