在express中的root之后使用可选参数传递路由控制?

Posted

技术标签:

【中文标题】在express中的root之后使用可选参数传递路由控制?【英文标题】:Passing route control with optional parameter after root in express? 【发布时间】:2011-10-10 17:10:48 【问题描述】:

我正在开发一个简单的 url-shortening 应用程序,并有以下快速路线:

app.get('/', function(req, res)
  res.render('index', 
    link: null
  );
);

app.post('/', function(req, res)
  function makeRandom()
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for( var i=0; i < 3 /*y u looking at me <33??*/; i++ )
      text += possible.charAt(Math.floor(Math.random() * possible.length));
    return text;
  
  var url = req.body.user.url;
  var key = makeRandom();
  client.set(key, url);
  var link = 'http://50.22.248.74/l/' + key;
  res.render('index', 
    link: link
  );
  console.log(url);
  console.log(key);
);

app.get('/l/:key', function(req, res)
  client.get(req.params.key, function(err, reply)
    if(client.get(reply))
      res.redirect(reply);
    
    else
      res.render('index', 
        link: null
      );
    
  );
);

我想从我的路由中删除/l/(以使我的网址更短)并使 :key 参数可选。这是正确的方法吗:

app.get('/:key?', function(req, res, next)
  client.get(req.params.key, function(err, reply)
    if(client.get(reply))
      res.redirect(reply);
    
    else
      next();
    
  );
);

app.get('/', function(req, res)
  res.render('index, 
    link: null
  );
);

不确定我是否需要指定我的/ 路由是“下一个”路由。但由于我唯一的其他路线是我更新的帖子/ 路线,我想它会正常工作。

【问题讨论】:

【参考方案1】:

这取决于 client.get 在传递 undefined 作为其第一个参数时所做的工作。

这样的东西会更安全:

app.get('/:key?', function(req, res, next) 
    var key = req.params.key;
    if (!key) 
        next();
        return;
    
    client.get(key, function(err, reply) 
        if(client.get(reply)) 
            res.redirect(reply);
        
        else 
            res.render('index', 
                link: null
            );
        
    );
);

在回调中调用next()没有问题。

根据this,处理程序按照添加的顺序被调用,所以只要你的下一个路由是 app.get('/', ...) 如果没有键就会被调用。

【讨论】:

谢谢,伙计。你的另类也很感激。可悲的是,我还有另一个问题,但我认为就像您指出的那样,这是client.get 返回的结果。我抛出了一个cannot call method 'indexOf' of null 错误。 另外,是否可以在else 中调用next() 抱歉评论节大声笑。已经修好了,但它是超级 jank xD【参考方案2】:

快递版:

"dependencies": 
    "body-parser": "^1.19.0",
    "express": "^4.17.1"
  

可选参数非常方便,你可以使用express轻松声明和使用它们:

app.get('/api/v1/tours/:cId/:pId/:batchNo?', (req, res)=>
    console.log("category Id: "+req.params.cId);
    console.log("product ID: "+req.params.pId);
    if (req.params.batchNo)
        console.log("Batch No: "+req.params.batchNo);
    
);

在上面的代码中,batchNo 是可选的。 Express 会认为它是可选的,因为在构建 URL 之后,我给出了一个“?” batchNo '/:batchNo?' 后的符号

现在我可以只使用 categoryId 和 productId 或全部三个参数调用。

http://127.0.0.1:3000/api/v1/tours/5/10
//or
http://127.0.0.1:3000/api/v1/tours/5/10/8987

【讨论】:

以上是关于在express中的root之后使用可选参数传递路由控制?的主要内容,如果未能解决你的问题,请参考以下文章

即使在经过身份验证的中间件之后,Express req.user 也是可选的

定义后无法将可选参数传递给express

PHP函数中的可选参数不考虑顺序

FlutterDart的方法中的可选参数方法作为参数传递

Express.js 路由:可选的 splat 参数?

Express.js 路由:可选的 splat 参数?