一个简单的 Restful API 生成器 restal

2017-09-27 09:43:47 +08:00
 qiuyk

这是之前写一个项目用到的小工具,给 API 服务器自动生成 Restful 风格的接口。最近整理出来,写了点测试就放 github 上了。支持的 HTTP 方法有 GET、POST、PUT、PATCH、DELETE,实现的功能其实也很简单,就是基本的 CURD,只不过给标准化了而已。当然还保留 Express 的中间件,如果标准化操作不符合要求可以拦截或进一步操作。

详细的介绍还是看 README 吧,这里贴一下基本用法。

// 在使用前先建立好 express app 和需要用到的 mongoose model

// 引入 Restal 类
const Restal = require('restal')

// 使用 mongoose model 创建一个 Restal 实例,并挂在到对应的 resource uri 上,就会生成对应的 api
const postApis = new Restal(post, '/post')

// 把 api 注入到 express app 中(或者说把路由导入到 express app 里)
postApis.inject(app)

当然,你也可以通过 express 中间件修改默认处理

//              ----+----+----+---------+----+----+----
// preHandle -> ... | f2 | f1 | handler | f1 | f2 | ... <- postHandle
//              ----+----+----+---------+----+----+----

// 添加预处理中间件拦截或预处理请求
postApis.preHandle('get', (req, res, next) => {
    const postModel = postApis.model
    const postUri = postApis.uri
    // 进行处理,例如权限验证等

    // 如果不调用 next()则拦截并阻止了默认处理
    // 但你需要自己响应请求
    next()
})

// 添加后处理中间件对数据进行后处理
postApis.postHandle('get', (result, req, res, next) => {
    const postModel = postApis.model
    const postUri = postApis.uri
    // 进行处理,例如数据处理等

    // 如果添加了后处理中间件,默认处理将不响应请求,并
    // 通过 result 参数向后处理中间件传递原响应结果,因此你
    // 需要自己响应请求
    res.status(200).send(result)
})

Github 地址:https://github.com/Siubaak/restal

代码一般,默默的求 star。

3924 次点击
所在节点    Node.js
2 条回复
EricJia
2017-09-27 10:42:36 +08:00
之前写的
```js
/**
* @author eric
* @version 1.0.0
*/

// const allow = ['index', 'show', 'create', 'update', 'delete'];

export default class Base {
constructor (router) {
this.router = router
}

resources (resource = '', controller = {}, functions = []) {
const router = this.router

const resolve = function (req, res) {
res.send('not opened')
}

const {
index = resolve,
show = resolve,
create = resolve,
update = resolve,
del = resolve
} = controller

router.get(resource, functions, index)
router.get(`${resource}/:id`, functions, show)
router.post(resource, functions, create)
router.put(`${resource}/:id`, functions, update)
router.patch(`${resource}/:id`, functions, update)
router.delete(`${resource}/:id`, functions, del)
return this
}
}
```
qiuyk
2017-09-27 11:52:04 +08:00
@EricJia 学习了~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/393947

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX