【问题标题】:How to handle null URL parameters with Express.js如何使用 Express.js 处理空 URL 参数
【发布时间】:2020-03-03 23:03:29
【问题描述】:

我正在为我的 Web 服务类分配作业,但不知道如何处理空 URL 参数。这是我的代码:

    app.get('/nachos/:x/:cheese/:tomatoes/:salsa/:hotsauce', (req, res) => {
        var x = parseInt(req.params['x'])
        var cheese = (req.params['cheese'])
        var tomatoes = (req.params['tomatoes'])
        var salsa = (req.params['salsa'])
        var hotsauce = (req.params['hotsauce'])

        res.send('You ordered ' + x + ' nacho(s) with ' + cheese + ', ' + tomatoes + ', ' + salsa + ', ' 
        + hotsauce + '.')})

此代码在填充所有参数后运行良好。但是如果我不想处理 null 参数,例如,salsa 并输入 url localhost:port/nachos/1/cheese/tomatoes/hotsauce

【问题讨论】:

  • 真的,如果某些元素是可选的,那么'/nachos/:x/:cheese/:tomatoes/:salsa/:hotsauce' 不是构建 URL 的正确方法。您可能应该使用结构为name=value 的查询字符串,然后您可以拥有所需的任何参数,并且可以轻松分辨出哪个是哪个。如果这是提交订单,那么它应该是一个 POST 并且数据应该在正文中,并且再次将在 name=value 表单中。

标签: javascript node.js express web-services url


【解决方案1】:

如果我没看错,问题是:

如果我不想处理null 参数,例如,我该如何处理, salsa 并输入网址localhost:port/nachos/1/cheese/tomatoes/hotsauce

你不会得到 null 它根本不匹配路由。

您可以将参数设为可选,例如:

app.get('/nachos/:x?/:cheese?/:tomatoes?/:salsa?/:hotsauce?', (req, res) => {

或添加要匹配的路线,这可能会失控。

app.get([
    //...
    '/nachos/:x/:cheese/:tomatoes',
    '/nachos/:x/:cheese/:tomatoes/:hotsauce',
    '/nachos/:x/:cheese/:tomatoes/:salsa/:hotsauce',
    //...
], (req, res) => {

【讨论】:

    【解决方案2】:

    您实际上并没有在如下所示的路由定义中执行可选参数:

    /nachos/:x/:cheese/:tomatoes/:salsa/:hotsauce
    

    因为为了匹配路由,每个参数都必须存在,并且req.params 要包含正确的选项,它们都必须按正确的顺序排列。如果这些是变体,其中一些是完全可选的,那么按照你原来的方式匹配它们就是不正确的 URL 设计,并且像 Express 中那样匹配变化的 URL 会有点麻烦。

    我能想到的最简单的方法是将可选成分放入查询字符串中,如下所示:

     /nachos/2?cheese=yes&tomatoes=yes&salsa=yes&hotsauce=yes
    

    然后,您只需匹配路由:/nachos/:x 作为 URL 的唯一必需选项,其他所有内容都可以在查询字符串中选择指定,您可以编写代码,使其默认为“否”,如果选项是不存在。因此,没有辣酱的订单可能是以下任何一种:

     /nachos/2?cheese=yes&tomatoes=yes&salsa=yes&hotsauce=no
     /nachos/2?cheese=yes&tomatoes=yes&salsa=yes
    

    没有辣酱或莎莎酱的订单可能是这样的:

     /nachos/2?cheese=yes&tomatoes=yes
    

    然后,您的请求处理程序将如下所示:

    const orderOptions = ["cheese", "tomatoes", "salsa", "hotsauce"];
    
    app.get('/nachos/:x', (req, res) => {
        console.log(req.query);
    
        let text = orderOptions.map(item => {
           return req.query[item] === "yes" ? item : null;
        }).filter(item => !!item).join(", ");
    
        res.send(`You ordered ${req.params.x} nacho(s) with ${text}.`);
    });
    

    我应该提到,如果这个请求实际上是指定一个订单,那么它可能应该是一个 POST,而不是一个 GET,并且选项应该在 POST 的主体中,并且它们将采用与查询字符串相同的形式,可能就像来自表单 POST 的 application/x-www-form-urlencoded 一样编码。

    【讨论】:

      【解决方案3】:

      以这种方式传递参数请求 API 用户以正确的顺序发送参数。要处理您想要的情况(缺少成分),您需要创建另一条路线来处理它。但是您可以通过其他方式执行此操作,例如将参数作为 query strings 传递,甚至在请求正文中发送它们(最好用于非 GET 路由器)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-31
        • 2019-01-19
        • 2023-03-05
        • 2013-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多