nodejs之strapi-proxy: 一个对接 strapi的解决方案

目录

strapi解决方案

2020年12月29日星期二

1. 组网图

2. 路由

3. 权限

(1) 环境变量:

(2) 权限入口:

(3) 权限配置:

4. nodejs调用graphql

5. Strapi与nodejs方案优点:

(1) 通过strapi-proxy将strapi能力拉通

(2) graphql通用的strapi增删改查

(3) 通过权限与rpc打通原go实现的接口

(4) strapi-proxy实现通用es查询接口

6. 解决难题:

7. 提升效率的方式:

(1) DAO层接口控制数目,特别是查询

(2) 使用graphql标准接口

(3) 与go语言拉通:权限、RPC

(4) 使用工具生成nodejs dao层代码

(5) 使用工具生成go语言多层代码

(6) 一个注意点:

8. 其它:

(1) dbtool数据迁移工具

(2) go代码生成工具

(3) nodejs容器打包

 

 

strapi解决方案

2020年12月29日星期二

 

 

  1. 组网图

faf9982ea91b43cdb7bc5c935727ed85.png

 

  1. 路由

http://test.ichub.cn/nodeapi/hub-strapi/api/hub-levels

http://test.ichub.cn/nodeapi/hub-strapi/graphql

nodeai指向 haproxy

Hub-strapi指向hub-proxy

Hub-proxy再指向strapi

  1. 权限

根据url确定权限的配置与鉴权,分为rest接口和graphql(strapi)接口,目前工程在strapi-proxy : hub合约域

    1. 环境变量

domain=hub

区分不同领域

    1. 权限入口:

app.use(Auth.authMiddleware())

19a7f88ad5b342c78f1201affa2729f7.png

 

    1. 权限配置:

rest白名单不需要鉴权

9cbaa5da43424b00baac5cc26c2ea2a0.png

rest鉴权名单

// rest url鉴权名单

const checkList = [

    //strapi api right

    {

        method: 'get', url: '/api/hub-meters',

        domain: 'S', type: 'B',  code: 'manage', key: 'print', action: 'insert',

    },

]

 

graphql白名单不需要鉴权

const graphqlWhiteList = [

    //已经使用

    {query: 'hubDictionarys'},

    {query: 'hubContractTypes'},

 

    //支付模板

    {query: 'hubCardTypes'},

    {query: 'hubCurrencyTypes'},

    {query: 'hubDictionarys'},

 

    {query: 'hubLevels'},

    {query: 'hubCards'},

    {query: 'hubAssets'},

    {mutation: 'createHubIcbank'},

    {mutation: 'createHubCardType'},

    {query: 'hubIcbanks'},

    {query: 'hubCurrencies'},

    // {mutation: 'createHubIcbank'},

    {mutation: 'updateHubIcbank'},

    {mutation: 'deleteHubIcbank'},

    {mutation: 'updateHubCard'}

]

 

 

graphql鉴权名单

const graphqlCheckList = [

    {

        query: 'hubDictionarys', //mutation

        domain: 'S', type: 'B', code: 'manage', key: 'print', action: 'read',

    },

    {

        query: 'hubContractTypes', //mutation

        domain: 'S', type: 'B', code: 'manage', key: 'print', action: 'read',

    },

    {

        mutation: 'createHubCardType', //mutation

        domain: 'S', type: 'B', code: 'manage', key: 'print', action: 'insert',

    },

    {

        mutation: 'createHubIcbank', //mutation

        domain: 'S', type: 'B', code: 'manage', key: 'print', action: 'insert',

    },

]

 

 

  1. nodejs调用graphql
  1. 配置queryCardsByCardType.gql

query {

  hubCards (filters:{

    user_id:{eq: "${user_id}"},

    card_type_id:{eq: "${card_type_id}"}

  }){

    data {

      id

      attributes {

        name

      }

    }

  }

}

 

  1. 调用graphql

let res = await strapiMsg.queryCardsByCardType(base, {user_id: user.id, card_type_id})

let query = gqlParser('queryCardsByCardType', data)

const res = await request.httpPost(base + '/graphql', {query})

return FormatResult.formatResultGraphql(res)

  1. 工程代码

a23b2c8d80bc4ceea9318f9966449e9d.png

 

  1. Strapi与nodejs方案优点:
    1. 通过strapi-proxy将strapi能力拉通
    2. graphql通用的strapi增删改查

graphql接口完全由模型驱动,也就是结构变化不用修改接口

包括排序和过滤条件

    1. 通过权限与rpc打通原go实现的接口

安装工具npm install protoc-gen-grpc -g

生成nodejs接口: protoc-gen-grpc --js_out=import_style=commonjs:. --grpc_out=. *.proto

    1. strapi-proxy实现通用es查询接口

nodejs支持es增删改查,特别是查询,Es index结构变化不用修改接口代码

  1. 配置环境变量

esEnv=release

  1. 配置ES操作类

79ea0157a13044769739a000b6005640.png

'use strict'

const {DaoService, elasticBuilder} = require('../../../public')

const HubService = {

    hubQuota: new DaoService('hub_quota'),

    hubContract: new DaoService('hub_contract'),

    hubShopContract: new DaoService('hub_shop_contract'),

    hubShopContractQuota: new DaoService('hub_shop_contract_quota'),

    hubMeters: new DaoService('hub_meters'),

    hubQuotaFlow: new DaoService('hub_quota_flow'),

 

}

 

  1. 通用查询

querySignQuota: async (query) => {

    if (!query.order_bys) {

        query.order_bys = "domain_id|asc,quota_item_id|asc"

    }

 

    //汇总

    const res = await HubService.hubShopContractQuota.esSearch(query)

 

  1. 入参根据有芯标准

{

    param:

        {

            domain_name: "人脉",

            card_id: "808695103533121537,

        },

    current: 1,

    page_size: 1,

    order_bys: 'qty|asc'

    

}

 

返回

{

    "code": 200,

    "msg": "操作成功!",

    "data": {

        "list": [

            {

                "type_name": "免费",

                "shop_contract_name": "员工建账合约模板1",//签约名称

                "quota_sku_id": "789154100014448641",

                "available": 4,

                "signer_shop_name": "剑圣123", //剩余

                "used": 0,

                "type": 20,

                "domain_id": 1,

                "domain_name": "人脉",//领域名称

                "quota_item_id": 18, 配额项id

                "contract_quota_id": "804358634236903425", //配额库存ID

                "quota_id": "788553764484186113",//配额id

                "state": 40,

                "shop_contract_id": "804358631905755137",

                "signer_user_id": "722819551922716673",

                "total_price": 8,//总价

                "end_time": 1678587574000,

                "combo_id": "789154094779105281",//

                "shop_id": "722876601929531393",

                "start_time": 1665541174000,

                "user_id": "722876601689931777",

                "qty": 4,//数量

                "invalid": 0,

                "signer_shop_id": "722819552698826753",

                "quota_item_name": "成员",//配额名称

                "brand_name": "有芯",//厂牌

                "remark": "备注",//备注

                "part_number": "型号",//型号

                "price":2 //单价,

                card_id: '808695103533121537',//卡id

            }

        ],

        "pagination": {

            "total": 14,

            "current": 1,

            "page_size": 1

        }

    }

}

 

  1. 解决难题:

最多的是Int64转字符串格式,此问题不解决strapi,nodejs无法使用。

Graphql, rpc , es都有此问题。

 

  1. 提升效率的方式
    1. DAO层接口控制数目,特别是查询
    2. 使用graphql标准接口
    3. 与go语言拉通:权限、RPC

   权限代码使用rpc

   

    1. 使用工具生成nodejs dao层代码

    打印模板nodejs部份代码,对表的操作类似gorm,

支持多表操作

    1. 使用工具生成go语言多层代码

    Cms、hub有使用。

其中query接口是通用的查询,一个接口搞定

    1. 一个注意点:

只有前端页面使用es查询,

后端用于生成查询前端接口的功能使用es组装

交易事务不能使用es查询,使用db操作。

  1. 其它:
    1. dbtool数据迁移工具

http://lei@192.168.13.235:10080/lei/strapi-dbtool.git

http://git clone https://gitee.com/ichub/strapi-dbtool.git

/*

*   author:   leijmdas

*   company:  farben

*   date :    2022-08-27

*

* */

const DbToolService = require('./dbtools/dbtool')

const key = 'hub'

 

const backup = false

const expDev = () => DbToolService.DBExp2Files(key, 'connDev', backup)

const expTest = () => DbToolService.DBExp2Files(key, 'connTest', backup)

const expRelease = () => DbToolService.DBExp2Files(key, 'connRelease', backup)

const expMaster = () => DbToolService.DBExp2Files(key, 'connMaster', backup)

 

module.exports = {

    expDev, expTest, expRelease, expMaster

}

 

expDev()

 

    1. go代码生成工具

75d1930fabbf4d7bb7e4b30f5d7d8966.png

    1. nodejs容器打包
  1. Dockerfile:

 

FROM node:16-alpine

MAINTAINER leijmdas <leijmdas@163.com>

 

RUN yarn config set registry  http://192.168.13.191:8081/repository/group-npm/

RUN yarn config set disturl https://npm.taobao.org/dist

#RUN yarn config set https://registry.npm.taobao.org/

 

WORKDIR /root/strapi-proxy

ENV strapiUrl hub-strapi-dev:1337

#ENV goapiUrl  hub-strapi-dev:1337

 

ADD ./strapi-proxy /root/strapi-proxy

EXPOSE 13370

 

RUN yarn

CMD [ "yarn","hub"]

 

  1. Strapi-proxy环境变量

environment:

    TZ: Asia/Shanghai

    # esHostgo环境相同 elasticsearch使用

    esHost: "192.168.13.184:9200,192.168.13.185:9200,192.168.13.186:9200"

    # esEnves使用与go环境相同

    esEnv: dev  #elasticsearch使用

    # domainstrapi权限使用,strapi领域确定

    domain: hub   #api check-right needs 权限需要

    #  natsHosts,与go环境相同 nats消息需要

    natsHosts: "192.168.13.235:4222,192.168.13.236:4222" # nats need

    #  etcdHost,与go环境相同 RPC服务需要

    etcdHost: "192.168.14.75:12379"         #"192.168.13.154:2379,192.168.13.155:2379,192.168.13.156:2379"

    # serviceNamestrapi使用

    serviceName: strapi-proxy-hubdev

    # proxyPortk8s确定

    proxyPort: 13370

    # strapiUrl:连接strapik8s确定

    strapiUrl: hub-strapi-dev:1337

 

 

 

  • 21
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leijmdas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值