我正在开发一个简单的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/(以缩短我的url),并使: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
  });
});

我不确定是否需要指定我的/号路由是"下一条"路由.但由于我唯一的其他路由是我更新的/后路由,我想它会很好地工作.

推荐答案

这取决于客户的具体情况.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()没有问题.

根据this的说法,处理程序是按添加顺序调用的,所以只要你的下一个路由是app.获取("/",…)如果没有 keys ,它将被调用.

Node.js相关问答推荐

通过 Node js 中的 TBA 执行 netsuite REST upsert 操作出现 401 错误

将 POST 的 json 变量格式化为 lambda

如果我在父文件夹中运行,子进程生成不起作用

如何设置 Puppeteer Select 器的唯一性?

使用pm2启动服务器

我如何在 Raku 的供应中注册不同的事件?

为什么我不能将 id 发送到后端并通过 findByIdAndRemove() 删除项目?

未捕获的错误: 只能用作 元素的子元素,永远不会直接呈现.请将您的 包裹在

Typescript 条件语句不过滤值?

Cloudflare 522 错误 - javascript 客户端连接到 node 服务器

TypeError:在使用 Jest、Supertest、Express、Typescript 进行测试时无法读取未定义的属性(读取listen)

如何从 github 编译第三方扩展?

突然 React 无法执行create-react-app命令.为什么会发生这种情况,我该如何解决?

Node.js mongodb 驱动程序异步/等待查询

如何使用 Mocha 测试正常(非 node 特定)JavaScript 函数?

从 Node.js 应用程序查询 Heroku 托管的 Postgres 数据库时出现自签名证书错误

ChildProcess 关闭、退出事件之间的区别

在 Jade 包含中使用变量

fs.createWriteStream 不会立即创建文件?

如何从 Node.js 应用程序Ping?