什么是SAM?

定义SAM
因为sam是yaml语法文件,所以需要解析yaml语法,使用yaml.js

举个例子,某个程序需要使用到云函数,并且需要创建两个数据表,SAM文件如下:

ApplicationName: 测试程序

云函数资源

Function:
# 运行环境
Container: nodejs 8.9
# 超时时间(秒)
Timeout: 60
Corn:

云数据库资源

Database:
# 需要创建的数据集合
Collections:
-
CollectionName: ‘ext-collection-a’
-
CollectionName: ‘ext-collection-b’
数据校验
由于前端输入的数据不可信,后端需要对传入的SAM进行校验。

随着依赖的资源字段增加,单纯使用 if-else 的逻辑判断,会让代码变得难以维护,可读性非常差。

通常有2种数据校验的思路:

借助 joi.js,在代码中增加校验逻辑
使用 ajv.js,分离Schema和代码逻辑
第2种思路耦合度更低,并且规则的改动和维护,不涉及代码改动,产品和运营同学也可以来维护规则。

按照schema的ajv语法,以前面的SAM文件为例,schema 的内容如下:

{
“type”: “object”,
“properties”: {
“ApplicationName”: {
“type”: “string”
},
“Function”: {
“type”: “object”,
“required”: [“Container”, “Timeout”],
“properties”: {
“Container”: {
“type”: “string”
},
“Timeout”: {
“type”: “number”
},
“Corn”: {
“type”: [“string”, “null”]
}
}
},
“Database”: {
“type”: “object”,
“Collections”: {
“type”: “array”,
“items”: {
“properties”: {
“CollectionName”: {
“type”: “string”
}
}
}
}
}
}
}
封装ajv的验证逻辑:

const Ajv = require(‘ajv’)
/**

  • 验证obj是否符合 Schema 定义

  • @param {object} obj

  • @param {string} schemaJson

  • @return {boolean}
    */
    function validateSchema(obj, schemaFilePath) {
    const schemaJson = require(schemaFilePath)

    const ajv = new Ajv()
    const validate = ajv.compile(schemaJson)
    const valid = validate(obj)
    if (!valid) {
    console.log(’>>> 错误字段信息:’, validate.errors)
    }
    return valid
    }
    变量注入
    有些时候,某些变量是动态的。例如,用户信息可能在运行过程中被注入到上下文,数据集合名称需要前端用户表单传入。

举个例子,前面创建的两个数据集合的名称由前端表单传入,对应字段是:collectionNameA和collectionNameB。

云数据库资源

Database:
# 需要创建的数据集合
Collections:
-
CollectionName: ‘ e n v . c o l l e c t i o n N a m e A ′ − C o l l e c t i o n N a m e : ′ {env.collectionNameA}' - CollectionName: ' env.collectionNameACollectionName:{env.collectionNameB}’
Absorbing material: www.goodsmaterial.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值