通过json 响应添加js function 增强业务灵活程度

直接在服务器的response中包含js 已经是比较常见的功能了,但是从业务角度,缺少灵活性,我们需要加载时候同时解析
基于模块快的加载机制是一个不错的选择(amd,cmd 都是不错的选择,类似的工具也很多),或者通过类型转换,比如json
object 到claas 这样我们也就能操作业务数据了,直接在json 数据中包含js function 也是一个不错的选择(可以服务端控制逻辑,但
是会存在大小的问题,但是我们也能解决,而且还会有一些安全的风险,但是还好,具体要看实现的技术了)

原理

  • 参考json 格式
 
let userids = {
    fetchid: function () {
        return Promise.resolve({
            name: "dalong1",
            age: 22
        })
     },
    fetchtext: function () { 
        return Promise.resolve({
            name: "dalong2",
            age: 33
        })
    },
    login: function () {
        return Promise.resolve({
        name: "dalong3",
        age: 44
    })}
}
  • 说明
    此数据我们需要经过序列化给客户端,之后客户端,反序列化,然后我们就可以直接使用了
  • 反序列化之后的格式
    对于函数转换为了字符串
 
{"fetchid":"function () {\n        return Promise.resolve({\n            name: \"dalong1\",\n            age: 22\n        })\n     }","fetchtext":"function () { \n        return Promise.resolve({\n            name: \"dalong2\",\n            age: 33\n        })\n    }","login":"function () {\n        return Promise.resolve({\n        name: \"dalong3\",\n        age: 44\n    })}"}
 

参考效果

 

 

业务集成使用

如果需要使用此代码,我们需要进行反序列化的处理,因为默认的json 反序列化的不支持的,还好社区有类似的实现

  • package.jon
 
{
  "name": "class-transformer-learning",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "is-promise": "^4.0.0",
    "json-fns": "^1.0.0",
  }
}
  • 代码
    说明:就是使用了json-fns 处理包含js的json,然后直接可以像方一样使用代码了
 
const isPromise = require("is-promise")
const JSON = require('json-fns')
let userids = {
    fetchid: function () {
        return Promise.resolve({
            name: "dalong1",
            age: 22
        })
     },
    fetchtext: function () { 
        return Promise.resolve({
            name: "dalong2",
            age: 33
        })
    },
    login: function () {
        return Promise.resolve({
        name: "dalong3",
        age: 44
    })}
}
let info =JSON.stringify(userids)
console.log(info)
for (let key inJSON.parse(info)) {
    if (userids.hasOwnProperty(key)) {
        let element = userids[key];
        if (isPromise(element)) {
            element.then(data => {
                console.log("default",data)
            }).catch(err=>{
                console.log("fetch",err)
            })
        }
        else {
            let funcCall = element();
            if (isPromise(funcCall)) {
                funcCall.then(data => {
                    console.log("fun call",data)
                    console.log(data)
                }).catch(err=>{
                    console.log("default",err)
                })
            }
        }
    }
}
  • 运行效果

 

 

说明

以上是一个实践的探索,基于此模式我们可以增强业务的灵活性,对于js的处理部分,我们可以基于nodejs 的生态或者基于gravvlvm(js 能力)
或者(golang 的gopherjs),deno(typescript 引擎,后边可能会调整)主要是很多时候我们的代码是需要编译的(js 新特性的兼容,有些语法是不能支持的)

参考资料

https://www.npmjs.com/package/json-fns
https://github.com/oracle/graal
https://github.com/gopherjs/gopherjs

posted on   荣锋亮  阅读(769)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2019-07-25 通过granfana 以及prometheus 比较zulu 、oracle、openjdk 等jvm 运行
2018-07-25 hasura graphql 角色访问控制
2018-07-25 hasura graphql schema 导出
2018-07-25 hasura graphql 模式拼接demo
2018-07-25 Reusing & Composing GraphQL APIs with GraphQL Bindings
2018-07-25 hasura graphql 模式拼接概念
2018-07-25 hasura graphql pg 自定义函数的使用

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示