在root用户进入Express后传递带有可选参数的路径控制吗?


87

我正在开发一个简单的URL缩短应用程序,并具有以下快速路由:

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

不知道我是否需要指定我的/路线是“下一条”路线。但是由于我唯一的其他路线是我更新的发布/路线,因此我认为它会很好地工作。

Answers:


193

这将取决于在未定义的第一个参数中传递client.get的方式。

这样的事情会更安全:

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()没问题。

根据这个,处理程序被调用的,因为它们添加的顺序,所以只要你的下一个路线是app.get(“/”,...)将如果没有关键调用。


谢啦。您的选择也受到赞赏。遗憾的是,我还有另一个问题,但我认为就像您指出的那样,这是由返回的结果client.get。我抛出一个cannot call method 'indexOf' of null错误。
Qcom 2011年

此外,将有可能调用next()else{}
Qcom 2011年

对不起,commentfest哈哈。解决了,但是它是超级垃圾xD
Qcom 2011年

1

速成版:

"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

在此处输入图片说明 在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.