2014-09-24 68 views
2

我想在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上?

谢谢。

UPDATE

最后,工作溶液如下。感谢大家。

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'); 
}); 
+0

感谢大家的建议。 – 2014-09-24 20:21:55

回答

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

如果下一个被调用时,它会尝试下一个路径。如果这个(和其他任何人)接下来调用,那么你会到达你的404处理程序。

2

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

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

如果我们有像URL /folder/topic,它满足路线1,并且请求被处理。 如果我们有/folder URL,它无法满足航线1,但满足航线2. 如果我们有一些不同的东西,比我们渲染路径3

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