V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qiuyk
V2EX  ›  Node.js

一个简单的 Restful API 生成器 restal

  •  
  •   qiuyk · 2017-09-27 09:43:47 +08:00 · 3925 次点击
    这是一个创建于 2622 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是之前写一个项目用到的小工具,给 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。

    2 条回复    2017-09-27 11:52:04 +08:00
    EricJia
        1
    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
        2
    qiuyk  
    OP
       2017-09-27 11:52:04 +08:00
    @EricJia 学习了~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   937 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:51 · PVG 03:51 · LAX 11:51 · JFK 14:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.