可扩展的节点快速路由

时间:2014-09-24 18:41:54

标签: node.js express routing

我想在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');
});

挑战是,:文件夹和:主题将匹配任何内容,因此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');
});

3 个答案:

答案 0 :(得分:5)

传递给app.get的第三个(可选)参数:nextnext实际上是一个回调,您可以调用它来使您的路线落到下一个路径。

所以,你可以这样做:

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处理程序。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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这样的网址,它会满足路由1,并处理请求。 如果我们有/folder url,则无法满足路径1,但满足路径2。 如果我们有不同的东西,那么我们渲染路径3。

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