V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
qiuyk
V2EX  ›  Node.js

一个简单的 Restful API 生成器 restal

  •  
  •   qiuyk · 2017-09-27 09:43:47 +08:00 · 4129 views
    This topic created in 2917 days ago, the information mentioned may be changed or developed.

    这是之前写一个项目用到的小工具,给 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 replies    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 学习了~
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Tools   ·   5067 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 07:44 · PVG 15:44 · LAX 00:44 · JFK 03:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.