前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >resource-router-middleware项目源码阅读

resource-router-middleware项目源码阅读

作者头像
用户1515472
发布2019-07-25 14:57:02
5300
发布2019-07-25 14:57:02
举报
文章被收录于专栏:忽如寄的前端周刊

resource-router-middleware是一个提供restful API的Express中间件,由preact作者developit开发。 一个简单使用案例就是:

代码语言:javascript
复制
const resource = require('resource-router-middleware');
let users = [];
const huruji = {
    id:12,
    name: 'huruji',
    age: 12,
    sex: 'man'
};
const grey = {
    id: 13,
    name: 'grey',
    age: 12,
    sex: 'man'
};

users = [huruji, grey];

module.exports = resource({
   mergeParams: true,
   id: 'user',
   load: function(res,id, callback) {
       callback(null, huruji);
   },
   list: function(req, res) {
       res.json(users);
   },
   create: function(req, res) {
       var user = req.body;
       users.push(user);
       res.json(user);
   },
    read: function(req, res) {
       res.json(req.user);
    },
    update: function(req, res) {
       var id = req.params[this.id];
       for(var i = users.length;i--;) {
           if(users[i].id === id){
               users[i] = req.body;
               users[i].id = id;
               return res.status(204).send('Accepted');
           }
       }
       res.status(404).send('Not found');
    },
    delete: function(req, res) {
       var id = req.params[this.id];
       for(var i =users.length;i--;) {
           if(users[i].id===id) {
               users.splice(i,1);
               return res.status(200);
           }
       }
       res.status(404).send('Not found');
    }
});
代码语言:javascript
复制
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const userResource = require('./user');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use('/user',userResource);


app.listen(5000, function(err) {
    if(err) {
        return console.log(err);
    }
    console.log('server is listening port 5000')
});

可以学习的点主要是: 1、Express.Router可以提供一个对象参数

代码语言:javascript
复制
{
 mergeParams: 是否保留父级路由的req.params,且父子的req.params冲突时,优先使用子级的
caseSensitive:路由的路径是否大小写敏感,默认为false
 strict:是否启用严格模式,即/foo与/foo/区别对待
}

2、router.param的使用 3、取反运算,这个使用真的是相当巧妙 4、restful API的设计

代码语言:javascript
复制
var Router = require('express').Router;

var keyed = ['get', 'read', 'put', 'update', 'patch', 'modify', 'del', 'delete'],
    map = { index:'get', list:'get', read:'get', create:'post', update:'put', modify:'patch' };

module.exports = function ResourceRouter(route) {
    route.mergeParams = route.mergeParams ? true : false;
    // Express.Router可以提供一个对象参数
    /**
     * @param {
     * mergeParams: 是否保留父级路由的req.params,且父子的req.params冲突时,优先使用子级的
     * caseSensitive:路由的路径是否大小写敏感,默认为false
     * strict:是否启用严格模式,即/foo与/foo/区别对待
     * }
     */
    var router = Router({mergeParams: route.mergeParams}),
        key, fn, url;

    // 如果有中间件则装载中间价
    if (route.middleware) router.use(route.middleware);

    // router.param方法的回调函数的参数分别是req,res,next,params的值,params的key
    // 使用这个我们可以为路由的params找到数据之后直接定义在req对象中,供后续处理
    if (route.load) {
        router.param(route.id, function(req, res, next, id) {
            route.load(req, id, function(err, data) {
                if (err) return res.status(404).send(err);
                req[route.id] = data;
                next();
            });
        });
    }

    for (key in route) {
        // fn为对应的http method
        fn = map[key] || key;
        if (typeof router[fn]==='function') {
            // ~取反位运算,这个很有意思,三目运算符只有在~keyed.indexOf(key)为0时运算'/',取反值与原值相加为-1的原则知原值keyed.indexOf(key)为-1,也就是说
            // url = ~keyed.indexOf(key) ? ('/:'+route.id) : '/'与url = (keyed.indexOf(key) > -1) ? ('/:'+route.id) : '/';效果相同
            // 意义在于如果用户是使用keyed数组里的元素来定义键的,则使用('/:'+route.id)路由路径,否则使用'/'路由路径
            url = ~keyed.indexOf(key) ? ('/:'+route.id) : '/';
            console.log(key);
            console.log('url:' + url)
            router[fn](url, route[key]);
        }
    }

    return router;
};

module.exports.keyed = keyed;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档