不到三分钟做出全套复杂的graphQL后端API
发布于 6 年前 作者 cheunghy 7262 次浏览 来自 分享

graphQL是Facebook开发的新一代的API,能够在一个请求中,处理原本RESTful的多个请求,所需字段由前端自由定义。在开发中,大大简化了前后端通信和协调的过程,提升开发效率。

如果没尝试过graphQL,现在是时候学一下了。

Amur是一个类似rails scaffold那样的脚手架工具,不同的是,它为graphQL API而生,不会生成前端的页面,拥有更强大的生成机制,支持更多数据类型,以及mongoose那种嵌套的数据库行的结构。

安装amur

npm install -g amur

生成一个amur后端

amur app my-new-app
cd my-new-app

生成API的基本命令格式

amur resource Coupon code:String title:String:Untitled user:User
amur resource User coupons:[Coupon]:user

这个格式几乎跟rails generator是一样的。不同的是,第二个冒号后面代表默认值(非引用类型),外链(引用类型)。 amur内置多种格式,String,Enum,Int,Number,Float,Boolean,Date。其中Number与Int同。其他类型会被amur理解成为引用类型。类型上面加[一对中括号],将类型变为这种类型的数组。

比起上述跟rails generator几乎一样的简单的语法,amur支持更多简化开发的特性。其中一个是类型修饰符。 比如,我们有一个用户表,用户有邮箱(必填,不能重复),性别(是个枚举),年龄(最小值18的整数),我们就可以使用以下命令生成model和API。

amur resource User 'email:String!$' 'gender:Enum{male,female}' 'age:Int>=18'

这里边,!意味着必填,$意味着唯一,>=是最小值。Enum{…}是Enum类型定义的一部分,并不是修饰符。其余的修饰符包括^ index,<=最大值,/…/匹配正则。

amur支持嵌套的类型

amur resource Address line:{ one:String two:String } country:String

使用{或[{作为类型定义,将余下输入放进嵌套结构内,使用}和}]可以跳出结构。可以无限嵌套。

还有更多功能介绍不完,文档在这里:https://github.com/zhangkaiyulw/amur

22 回复

@cheunghy 哈哈

来自酷炫的 CNodeMD

@cheunghy 大佬问两个问题。 1 下面👇这些例子应该支持从datamodel或者graphql文件导入 amur resource User name:String age:Int posts:[Post]:author amur resource Post title:String content:String author:User 2 啥时候支持ts

不支持typescript 是硬伤啊。 nest.js 表示很伤心~

@zuohuadong 打了鸡血一样推nest.js啊兄弟👍

@xiaozhongliu 哈,Graphql 这块不好弄,感觉写起来有点麻烦,就想找找有没有自动生成的

@xiaozhongliu 说实话, nest.js是真的好, 完美的设计

@xiaozhongliu 倾家荡产推nest

@lxzgg 蛮好的蛮好的, 很欣赏这么有激情的骚年

这个就是不支持ts,还有生成的代码可读性差了点,是个有潜力过万star的项目

@walter211 你是不是现有项目想要集成GraphQL呢?现有项目已经有了mongoose model定义对吧

统计下,多少人是要开新的graphql项目,多少人是集成到现有项目?

@cheunghy 没有,我手动改成mysql,是的,主要是想把CURD设计和数据库自动生成一些模板代码做自动化,目前就差你这个工具的功能了(也是最复杂的……),希望大佬有计划更新,我会多测试,多提pr。

@walter211 你用的哪个ORM?我考虑着支持sequelize。

已经在做Sequelize的支持了。但是,不能像mongoose一样,任意嵌套字段。这是数据库本身的限制。

@cheunghy 别,先支持typeorm

@cheunghy Sequelize没有这个好用,bug还多

集成一个orm,还是挺简单的。大家可以提pr。我在做sequelize集成了,有样本代码可以看的。

sequelize 基本已经支持了。

@cheunghy 优先考虑 typeorm 吧。sequelize 真是个废…

回到顶部