1

作业:
我对 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. 我有一个查找 /: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

4

2 回答 2

4

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

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

于 2013-07-09T08:04:11.407 回答
0

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

于 2017-09-14T14:31:15.117 回答