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

问题描述 投票:0回答:2

作业:
我对 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 //路径以同样的方式但是在node.js中我必须写两个 单独的 app.get 检查来做到这一点。我怎样才能做到这一点 一项检查,以便 /path, //path, ///path 给出相同的响应

  2. 我有一个查找 /:path 的 url,并且 path 可以取值 字典中列出了

    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]);
    });
    

    如何限制应用程序仅接受 a、b、c,而不添加 if else 条件。 目前我正在做

    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

node.js express url-routing
2个回答
4
投票

关于#1,如果没有更好的解决方案,比如

app.use(function (req,res,next) { 
    req.url = req.url.replace(/[\/]+/g, '/'); 
    next(); }
); 

将确保后续路由不会看到任何重复的斜杠。 -@Andreas Hultgren

关于#3,我很确定不可能将查询字符串与express'路由器匹配。但找不到证实这一点的消息来源。 -@Andreas Hultgren


0
投票

跟进 @Gaurav 对#1 的评论:与其更改路由中的 url 并继续处理请求,不如“应该”触发 3xx 重定向,以便将有问题的请求转发到规范变体。 (这样,正确的 URL 就会在浏览器中更新。或者发出请求的任何类型的客户端都会意识到原始的双斜杠 URL 在技术上是无效的。)

© www.soinside.com 2019 - 2024. All rights reserved.