分享一个自己写的GraphQL变种解析器
发布于 8 年前 作者 yorkie 6197 次浏览 来自 分享

最近团队中需要通过从持久化数据库中生成一份可冗余的数据,然后放到MongoDB中供前端查询,在开始的时候想过用JSON/YAML/TOML,不过经过尝试之后发现都不是特别合适,太过复杂,对于一支追求极致的程序员,突然想到既然这份数据是直接提供给前端视图的,那不妨用GraphQL试试。

于是开始balabala看它的标准,文档还有实现,不过后面发现GraphQL作为查询语句(Query Language),在对文档进行表述的时候还是有比较大的局限性,再后来,我就自己基于GraphQL的语法自己实现了一个简单的解析器,并且在每个表达式之前,增加了一个用于表示类型的token,并且将解析的API从原有的查询抽离出来,也就是说现在可以直接拿到ML的语法树。

于是为了表示一个用户的文档(Document),我们可以这样定义:

User {
  nickname,
  avatarUrl,
  phone,
  identities {
    provider,
	profile
  },
  orders(limit=5, orderBy=modified) {
    status
  }
}

上面的一段代码就可以表示一个用户,并且获得该用户的最近的5个订单,每个订单只显示其状态(status)。你可能并不能使用GraphML这样一个略微复杂的操作,GraphML在其中扮演的角色只是解析出这段DSL的语法树,然后我们需要通过这个语法树里拿到的信息来生成对应的数据/文档,并存储到对应的数据库中。

当然,这只是GraphML在WeFlex中目前的用法,在上述的使用过程中,体验还算不错,在业务上的表述算是很简单明了。不过也不排除会存在其他的用法了,最后放出Github链接:https://github.com/weflex/graphml-parser

另外,我们团队(WeFlex)长期招收JavaScript开发工程师,有兴趣的同学请附上Github地址发到:yorkie.liu@theweflex.com (已经成功从该论坛成功招到一名同学)

回到顶部