处理express.js + node.js中的url?接受特定的单词,双斜线等等

时间:2013-04-08 06:32:45

标签: node.js express url-routing

作业:
我对node.js中的url处理知之甚少

app.param('id', /^\d+$/);
app.get('/user/:id', function(req, res){
    res.send('user ' + req.params.id);
});

只接受/ user / 1,/ user / 2 ...即。 id为整数

app.get('/:type(discussion|page)/:id', ...)  

只接受带讨论值或页面

的类型
app.param('range', /^(\d+)\-(\d+)?$/);
app.get('/range/range=:range', function(req, res){
var range = req.params.range;
    res.send('from ' + range[1] + ' to ' + range[2]);
});

将轻松处理整数范围并直接为我们提供一个数组,而无需任何拆分或解析和验证。

问题:

  1. 通常服务器接受www.example.com/path和 www.example.com//path以相同的方式但在node.js我必须写两个 单独的app.get检查来做到这一点。我怎样才能实现这一目标 一检查,以便/ path,// path,// / path给出相同的响应

  2. 我有一个查找/的路径:路径和路径可以取值 列在字典中

    var dict={ 
        "a":"You called a", 
        "b": "b is second", 
        "c": "cats are all over internet"
    }
    app.get('/:charc',function(req,res){ 
       res.send(dict[charc]);
    });
    

    如何在不添加if else条件的情况下限制app仅接受a,b,c。 目前我正在做

    if (typeof dict[charc] == 'undefined') res.send(404, 'Sorry, we cannot find that!');
    
  3. 我可以在'?'之后调用范围参数(来自作业部分)喜欢

    app.get('/range?range=:range',...
    

    使用网址www.example.com/range?range=123-234

2 个答案:

答案 0 :(得分:3)

关于#1,如果没有更好的解决方案,比如app.use(function(req,res,next){req.url = req.url.replace(/ [/] + / g,'/'); next ();});将确保没有后续路线会看到任何重复的斜杠。 - @ Andreas Hultgren

关于#3,我很确定不可能将查询字符串与快速路由器匹配。找不到确认这一点的来源。 - @ Andreas Hultgren

答案 1 :(得分:0)

跟随@Gaurav对#1的评论:不是改变路线中的网址并继续处理请求,而是应该触发3xx重定向,以便将违规请求转发给规范变体。 (这样在浏览器中更新了正确的URL。或者无论何种类型的客户端使得请求都知道原始的双斜杠URL在技术上是无效的。)