【问题标题】:Scalable Node Express Routes可扩展节点快速路由
【发布时间】:2014-11-19 08:57:51
【问题描述】:

我想在 Node Express 中设置可扩展的路由。

我了解如何设置工作路线...这是我正在努力解决的失败/不匹配问题。更具体地说,我正在努力解决如何处理 404 错误。

这就是我所拥有的......

app.get('/:folder',function(req,res) {
    var path = 'site/' + req.params.folder + '/index.jade';
    res.render(path);
});

app.get('/:folder/:topic',function(req,res) {
    var path = 'site/' + req.params.folder + '/' + req.params.topic;
    res.render(path);
});

app.use(function(req, res, next){
    res.status(404).render('site/404.jade');
});

挑战在于, :folder 和 :topic 将匹配任何内容,因此 404 永远不会触发。我不想硬编码我们所有的文件夹和主题名称。那么,如果文件夹/主题不存在,我该如何设置路由,以便请求将通过 404?

谢谢。

更新

最终,工作解决方案如下。感谢大家。

var fs = require('fs');

app.get('/:folder',function(req,res,next) {
    var path = __dirname + '/views/site/' + req.params.folder + '/index.jade';

    if(fs.existsSync(path))
    {
        res.render(path);
    }
    else
    {
        next();
    }
});

app.get('/:folder/:topic',function(req,res,next) {
    var path = __dirname + '/views/site/' + req.params.folder + '/' + req.params.topic + '.jade';

    if(fs.existsSync(path))
    {
        res.render(path);
    }
    else
    {
        next();
    }
});

app.use(function(req, res){
    res.status(404).render('site/404.jade');
});

【问题讨论】:

  • 感谢大家的建议。

标签: node.js express routing


【解决方案1】:

还有第三个(可选)参数传递给app.getnextnext 实际上是一个回调,你可以调用它来让你的路由掉到下一个。

所以,你可以这样做:

app.get('/:folder',function(req, res, next) {
    var path = 'site/' + req.params.folder + '/index.jade';
    var pathIsValid = ...  // use something like fs.exists to check if the path is valid
    if (pathIsValid) {
        res.render(path);
    } else {
        next()
    }
});

如果调用 next ,它将尝试下一条路线。如果接下来调用(以及任何其他),那么您将进入您的 404 处理程序。

【讨论】:

    【解决方案2】:

    在您的文件夹和主题路由中,您需要使用fs.exists 来查看视图路径是否存在,如果不存在,只需调用next() 而不渲染任何内容。然后路由将继续到 404 处理程序。

    【讨论】:

      【解决方案3】:

      试试

      app.get('/:folder/:topic',function(req,res) {
          var path = 'site/' + req.params.folder + '/' + req.params.topic;
          if(fileExists(path)) {
            res.render(path);
          } else {
            res.status(404).render('site/404.jade');        
          }
      });
      
      app.get('/:folder',function(req,res) {
          var path = 'site/' + req.params.folder + '/index.jade';
          if(fileExists(path)) {
            res.render(path);
          } else {
            res.status(404).render('site/404.jade');        
          }
      });
      
      
      app.all('*', function(req, res){
          res.status(404).render('site/404.jade');
      });
      

      如果我们有/folder/topic这样的url,它满足路由1,并且请求被处理。 如果我们有/folder url,它不能满足路由1,但满足路由2。 如果我们有不同的东西,则渲染路径 3。

      fileExists 是一些要验证的函数,该模板存在,例如http://nodejs.org/api/fs.html#fs_fs_existssync_path

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-27
        • 1970-01-01
        • 2014-02-03
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多