返回介绍

2.2 内容管理系统的实现

发布于 2024-01-20 01:12:18 字数 6068 浏览 0 评论 0 收藏 0

为了方便你学习,为你提供了完整代码(代码地址),你可以参考着学习。

$ git clone https://github.com/poetries/serverless-class
$ cd 15/cms

整个代码目录结构如下:

.
├── package.json
├── src
│   ├── config
│   │   └── index.js
│   ├── db
│   │   └── client.js
│   ├── function
│   │   ├── article
│   │   │   ├── create.js
│   │   │   ├── delete.js
│   │   │   ├── detail.js
│   │   │   └── update.js
│   │   └── user
│   │   ├── login.js
│   │   └── register.js
│   └── middleware
│   └── auth.js
└── template.yml

其中,所有业务代码都放在 src 目录中:

  • config/index.js 是配置文件,里面包含身份凭证等配置信息;
  • db/client.js 对表格存储的增删改查操作进行了封装,方便在函数中使用(将数据库的操作封装还有一个好处是,如果你之后想要迁移到其他数据库,只要修改 db/client.js 中的逻辑,不用修改业务代码);
  • middleware 目录中是一些中间件,比如 auth.js ,用于身份认证;
  • functions 目录中就是所有函数,登录、注册、创建文章等,每个功能分别对应一个函数;
  • template.yaml 是应用配置文件,包括函数和 API 网关的配置。

根据前面梳理的系统功能,我们需要实现以下几个 API:

用户注册POST /user/register
用户登录POST /user/login
发布文章POST /article/create
查询文章GET /article/detail/[article_id]
更新文章POST /article/update
删除文章PUT /article/delete/[article_id]

每个 API 对应一个具体的函数,每个函数也都有一个与之对应的 API 网关触发器。由于这些函数属于同一个应用,所以我们可以通过一个 template.yaml 来定义所有函数。同时也可以在 template.yaml 中定义函数的 API 网关触发器,这样部署函数时,就会自动创建 API 网关。

内容管理系统的 template.yaml 格式如下:

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  # 函数服务,该服务中的函数都是内容管理系统的函数
  serverless-cms:
  Type: 'Aliyun::Serverless::Service'
  Properties:
  Description: 'Serverless 内容管理系统'
  # 函数名称
  [functionName]:
  Type: 'Aliyun::Serverless::Function'
  Properties:
  # 函数路径
  Handler: <functionPath>.handler
  Runtime: nodejs12
  CodeUri: './'
  # API 网关分组,分钟中的所有 API 都是内容管理系统的 API
  ServerlessCMSGroup: 
  Type: 'Aliyun::Serverless::Api'
  Properties:
  StageName: RELEASE
  DefinitionBody:
  <Path>: # 请求的 path
    post: # 请求的 method
    x-aliyun-apigateway-api-name: user_register # API 名称
    x-aliyun-apigateway-fc: # 当请求该 API 时,要触发的函数,
    arn: acs:fc:::services/${serverless-cms.Arn}/functions/${<functionName>.Arn}/
    timeout: 3000

template.yaml 主要分为两部分: 函数定义和 API 网关定义,每个函数都有一个与之对应的 API 网关。我们用 serverless-cms 服务来表示内容管理系统这个应用,服务内的所有函数都是内容管理系统的函数。同理,ServerlessCMSGroup 这个 API 网关分组中的所有 API 都是内容管理系统的 API。

完整的 template.yaml 配置如下:

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  # 函数服务
  serverless-cms:
  Type: 'Aliyun::Serverless::Service'
  Properties:
  Description: 'Serverless 内容管理系统'
  user-register:
  Type: 'Aliyun::Serverless::Function'
  Properties:
  Handler: src/function/user/register.handler
  Runtime: nodejs12
  CodeUri: './'
  user-login:
  Type: 'Aliyun::Serverless::Function'
  Properties:
  Handler: src/function/user/login.handler
  Runtime: nodejs12
  CodeUri: './'
  article-create:
  Type: 'Aliyun::Serverless::Function'
  Properties:
  Handler: src/function/article/create.handler
  Runtime: nodejs12
  CodeUri: './'
  article-detail:
  Type: 'Aliyun::Serverless::Function'
  Properties:
  Handler: src/function/article/detail.handler
  Runtime: nodejs12
  CodeUri: './'
  article-update:
  Type: 'Aliyun::Serverless::Function'
  Properties:
  Handler: src/function/article/update.handler
  Runtime: nodejs12
  CodeUri: './'
  article-delete:
  Type: 'Aliyun::Serverless::Function'
  Properties:
  Handler: src/function/article/delete.handler
  Runtime: nodejs12
  CodeUri: './'
  # API 网关分组
  ServerlessCMSGroup: 
  Type: 'Aliyun::Serverless::Api'
  Properties:
  StageName: RELEASE
  DefinitionBody:
  '/user/register': # 请求的 path
    post: # 请求的 method
    x-aliyun-apigateway-api-name: user_register # API 名称
    x-aliyun-apigateway-fc: # 当请求该 API 时,要触发的函数,
    arn: acs:fc:::services/${serverless-cms.Arn}/functions/${user-register.Arn}/
    timeout: 3000
  '/user/login':
    post:
    x-aliyun-apigateway-api-name: user_login
    x-aliyun-apigateway-fc:
    arn: acs:fc:::services/${serverless-cms.Arn}/functions/${user-login.Arn}/
    timeout: 3000
  '/article/create':
    post:
    x-aliyun-apigateway-api-name: article_create
    x-aliyun-apigateway-fc:
    arn: acs:fc:::services/${serverless-cms.Arn}/functions/${article-create.Arn}/
    timeout: 3000
  '/article/detail/[article_id]':
    GET:
    x-aliyun-apigateway-api-name: article_detail
    x-aliyun-apigateway-request-parameters:
    - apiParameterName: 'article_id'
    location: 'Path'
    parameterType: 'String'
    required: 'REQUIRED'
    x-aliyun-apigateway-fc:
    arn: acs:fc:::services/${serverless-cms.Arn}/functions/${article-detail.Arn}/
    timeout: 3000
  '/article/update/[article_id]':
    PUT:
    x-aliyun-apigateway-api-name: article_update
    x-aliyun-apigateway-request-parameters:
    - apiParameterName: 'article_id'
    location: 'Path'
    parameterType: 'String'
    required: 'REQUIRED'
    x-aliyun-apigateway-fc:
    arn: acs:fc:::services/${serverless-cms.Arn}/functions/${article-update.Arn}/
    timeout: 3000
  '/article/delete/[article_id]':
    DELETE:
    x-aliyun-apigateway-api-name: article_update
    x-aliyun-apigateway-request-parameters:
    - apiParameterName: 'article_id'
    location: 'Path'
    parameterType: 'String'
    required: 'REQUIRED'
    x-aliyun-apigateway-fc:
    arn: acs:fc:::services/${serverless-cms.Arn}/functions/${article-delete.Arn}/
    timeout: 3000

在这份配置中,需要注意两个地方:

函数的 Handler 配置,Handler 可以写函数路径,比如 src/function/user/register.handler 表示 src/function/user/目录中的 register.js 文件中的 handler 方法

API 网关配置中的 /article/detail/[article_id]Path ,这种带参数的 PATH,必须使用 x-aliyun-apigateway-request-parameters 指定 Path 参数。

接下来,我们就来实现内容管理系统的各个 API,也就是 template.yaml 中定义的各个函数。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文