提交 b2c705d5 编写于 作者: inkwalk's avatar inkwalk

docs: update uni-cloud-router

上级 be406644
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
* 扩展能力 * 扩展能力
* [uni-id](uniCloud/uni-id.md) * [uni-id](uniCloud/uni-id.md)
* [uniCloud admin](uniCloud/admin.md) * [uniCloud admin](uniCloud/admin.md)
* [uni-cloud-router](uniCloud/uni-cloud-router.md)
* [unipay](uniCloud/unipay.md) * [unipay](uniCloud/unipay.md)
* [发送短信](uniCloud/send-sms.md) * [发送短信](uniCloud/send-sms.md)
* [前端网页托管](uniCloud/hosting.md) * [前端网页托管](uniCloud/hosting.md)
......
...@@ -2,36 +2,7 @@ ...@@ -2,36 +2,7 @@
> 基于 koa 风格的 uniCloud 云函数路由库,同时支持 uniCloud 客户端及 URL 化访问 > 基于 koa 风格的 uniCloud 云函数路由库,同时支持 uniCloud 客户端及 URL 化访问
--- ## 介绍
- [云函数端](#云函数端)
- [安装](#安装)
- [目录结构](#目录结构)
- [控制器(Controller)](#控制器controller)
- [如何编写 Controller](#如何编写-controller)
- [获取请求参数](#获取请求参数)
- [调用 Service](#调用-service)
- [定制 URL 化返回的状态码](#定制-url-化返回的状态码)
- [服务(Service)](#服务service)
- [使用场景](#使用场景)
- [如何编写 Service](#如何编写-service)
- [使用 Service](#使用-service)
- [中间件(Middleware)](#中间件middleware)
- [开发中间件](#开发中间件)
- [使用中间件](#使用中间件)
- [Context](#context)
- [获取方式](#获取方式)
- [客户端](#客户端)
- [发送请求](#发送请求)
- [返回结果](#返回结果)
## 云函数端
### 安装
```bash
npm install --save uni-cloud-router
```
### 目录结构 ### 目录结构
...@@ -45,41 +16,82 @@ npm install --save uni-cloud-router ...@@ -45,41 +16,82 @@ npm install --save uni-cloud-router
| ├── user.js | ├── user.js
``` ```
### 快速开始
为了快速上手,提供了一个简单的 demo 示例,以创建是一个 `hello-uni-cloud-router` 云函数为例,演示如何通过 `uni-cloud-router` 组织代码:
**1.添加入口文件**
```js ```js
// index.js (通常无需改动) // index.js (通常无需改动)
const Router = require('uni-cloud-router').Router // 引入 Router const Router = require("uni-cloud-router").Router; // 引入 Router
const router = new Router(require('./config.js')) // 根据 config 初始化 Router const router = new Router(require("./config.js")); // 根据 config 初始化 Router
exports.main = async (event, context) => { exports.main = async (event, context) => {
return router.serve(event, context) // 由 Router 接管云函数 return router.serve(event, context); // 由 Router 接管云函数
} };
``` ```
**2.添加配置文件**
```js ```js
// config.js // config.js
module.exports = { module.exports = {
debug: true, // 调试模式时,将返回 stack 错误堆栈 debug: true, // 调试模式时,将返回 stack 错误堆栈
baseDir: __dirname, // 必选,应用根目录 baseDir: __dirname, // 必选,应用根目录
middleware: [], // 自定义中间件 middleware: [], // 自定义中间件
} };
```
**3.在 controller 文件夹下创建一个 hello.js**
创建一个 controller
```js
const { Controller } = require("uni-cloud-router");
module.exports = class HelloController extends (
Controller
) {
sayHello() {
return this.service.hello.sayHello();
}
};
``` ```
**4.在 service 文件夹下创建一个 hello.js**
创建一个 service
```js ```js
// controller/user.js const { Service } = require("uni-cloud-router");
const uniID = require('uni-id') module.exports = class HelloService extends (
const Controller = require('uni-cloud-router').Controller Service
// 必须继承 Controller ) {
module.exports = class UserController extends Controller { sayHello() {
async login() { return {
const { username, password } = this.ctx.data // 获取请求参数 data: "welcome to uni-cloud-router!",
// 使用 uni-id 登录 };
return uniID.login({
username,
password,
})
} }
};
```
到这里,已创建好了是一个 `hello-uni-cloud-router` 云函数(注意:需上传云函数后,前端才能访问)。
**5.在页面里调用云函数**
在页面中 URL 化访问 hello(controller)下 sayHello:
```js
sayHello() {
this.request('hello/sayHello', {}).then(res => {
this.title = res.data
})
} }
``` ```
以上代码仅作为示例,建议点击右侧【使用 HBuilderX 导入示例项目】尝试。
## 深入学习
### 控制器(Controller) ### 控制器(Controller)
负责解析用户的输入,处理后返回相应的结果。 负责解析用户的输入,处理后返回相应的结果。
...@@ -97,23 +109,25 @@ module.exports = class UserController extends Controller { ...@@ -97,23 +109,25 @@ module.exports = class UserController extends Controller {
```js ```js
// controller/post.js // controller/post.js
const Controller = require('uni-cloud-router').Controller const Controller = require("uni-cloud-router").Controller;
// 必须继承 Controller 类 // 必须继承 Controller 类
module.exports = class PostController extends Controller { module.exports = class PostController extends (
Controller
) {
async create() { async create() {
const { ctx, service } = this const { ctx, service } = this;
// 校验参数 // 校验参数
ctx.validate({ ctx.validate({
title: { type: 'string' }, title: { type: "string" },
content: { type: 'string' }, content: { type: "string" },
}) });
// 组装参数 // 组装参数
const author = ctx.auth.uid const author = ctx.auth.uid;
const post = Object.assign(ctx.data, { author }) const post = Object.assign(ctx.data, { author });
// 调用 Service 进行业务处理 // 调用 Service 进行业务处理
return service.post.create(post) return service.post.create(post);
} }
} };
``` ```
定义的 Controller 类,会在每一个请求访问时实例化一个全新的对象,会有下面几个属性挂在 `this` 上。 定义的 Controller 类,会在每一个请求访问时实例化一个全新的对象,会有下面几个属性挂在 `this` 上。
...@@ -131,7 +145,7 @@ module.exports = class PostController extends Controller { ...@@ -131,7 +145,7 @@ module.exports = class PostController extends Controller {
```js ```js
class PostController extends Controller { class PostController extends Controller {
async listPosts() { async listPosts() {
const data = this.ctx.data const data = this.ctx.data;
// { // {
// username: 'demo', // username: 'demo',
// password: 'demo', // password: 'demo',
...@@ -149,11 +163,11 @@ Controller 中可以调用任何一个 Service 上的任何方法,同时 Servi ...@@ -149,11 +163,11 @@ Controller 中可以调用任何一个 Service 上的任何方法,同时 Servi
```js ```js
class PostController extends Controller { class PostController extends Controller {
async create() { async create() {
const { ctx, service } = this const { ctx, service } = this;
const author = ctx.auth.uid const author = ctx.auth.uid;
const post = Object.assign(ctx.data, { author }) const post = Object.assign(ctx.data, { author });
// 调用 service 进行业务处理 // 调用 service 进行业务处理
return service.post.create(post) return service.post.create(post);
} }
} }
``` ```
...@@ -166,7 +180,7 @@ Service 的具体写法,请查看 [Service](#服务service) 章节。 ...@@ -166,7 +180,7 @@ Service 的具体写法,请查看 [Service](#服务service) 章节。
class PostController extends Controller { class PostController extends Controller {
async create() { async create() {
// 设置状态码为 201 // 设置状态码为 201
this.ctx.status = 201 // 仅当使用 HTTP/HTTPS 请求时生效 this.ctx.status = 201; // 仅当使用 HTTP/HTTPS 请求时生效
} }
} }
``` ```
...@@ -190,13 +204,15 @@ class PostController extends Controller { ...@@ -190,13 +204,15 @@ class PostController extends Controller {
```js ```js
// service/post.js // service/post.js
const Service = require('uni-cloud-router').Service const Service = require("uni-cloud-router").Service;
// 必须继承 Service // 必须继承 Service
module.exports = class PostService extends Service { module.exports = class PostService extends (
Service
) {
async create(data) { async create(data) {
return this.db.add(data) return this.db.add(data);
} }
} };
``` ```
定义的 Service 类是懒加载的,只有当访问到它的时候才会去实例化它,会有下面几个属性挂在 `this` 上。 定义的 Service 类是懒加载的,只有当访问到它的时候才会去实例化它,会有下面几个属性挂在 `this` 上。
...@@ -221,22 +237,22 @@ module.exports = class PostService extends Service { ...@@ -221,22 +237,22 @@ module.exports = class PostService extends Service {
```js ```js
// middleware/auth.js // middleware/auth.js
const uniID = require('uni-id') const uniID = require("uni-id");
module.exports = (options) => { module.exports = (options) => {
// 初始化 uniID 配置 // 初始化 uniID 配置
uniID.init(options) uniID.init(options);
// 返回中间件函数 // 返回中间件函数
return async function auth(ctx, next) { return async function auth(ctx, next) {
// 校验 token // 校验 token
const auth = uniID.checkToken(ctx.event.uniIdToken) const auth = uniID.checkToken(ctx.event.uniIdToken);
if (auth.code) { if (auth.code) {
// 校验失败,抛出错误信息 // 校验失败,抛出错误信息
throw { code: auth.code, message: auth.message } throw { code: auth.code, message: auth.message };
} }
ctx.auth = auth // 设置当前请求的 auth 对象 ctx.auth = auth; // 设置当前请求的 auth 对象
await next() // 执行后续中间件 await next(); // 执行后续中间件
} };
} };
``` ```
示例: 示例:
...@@ -250,21 +266,21 @@ module.exports = (options) => { ...@@ -250,21 +266,21 @@ module.exports = (options) => {
1. 通过 config.js 配置 1. 通过 config.js 配置
```js ```js
const auth = require('./middleware/auth.js') // 引入 auth 中间件 const auth = require("./middleware/auth.js"); // 引入 auth 中间件
module.exports = { module.exports = {
debug: true, // 调试模式时,将返回 stack 错误堆栈 debug: true, // 调试模式时,将返回 stack 错误堆栈
baseDir: __dirname, // 指定应用根目录 baseDir: __dirname, // 指定应用根目录
middleware: [ middleware: [
[ [
//数组格式,第一个元素为中间件,第二个元素为中间件生效规则配置 //数组格式,第一个元素为中间件,第二个元素为中间件生效规则配置
auth({ tokenSecret: 'tokenSecret-demo' }), // 注册中间件 auth({ tokenSecret: "tokenSecret-demo" }), // 注册中间件
{ enable: true, ignore: /\/login$/ }, // 配置当前中间件生效规则,该规则表示以`/login`结尾的路由不会执行 auth 中间件校验 token { enable: true, ignore: /\/login$/ }, // 配置当前中间件生效规则,该规则表示以`/login`结尾的路由不会执行 auth 中间件校验 token
], ],
], ],
} };
``` ```
2. 中间件配置项 2. 中间件配置项
- enable 控制中间件是否开启。 - enable 控制中间件是否开启。
- match 设置 - match 设置
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册