Express:自动查看路由

Express: Automatic View Routing

是否可以创建一个自动将请求路由到与服务器端呈现模板相对应的路径的路由?有点像 app.use(express.static(__dirname + '/public')) 对静态内容的作用?

我的意思是我用的是车把:

const expressHandlebars = require('express-handlebars');
app.engine('handlebars', expressHandlebars({
    defaultLayout: 'main'}))

我发现自己经常做的是这样做:

app.get('/home', (req, res) =>{
    res.render('home')})

app.get('/about', (req, res) =>{
    res.render('about')})

app.get('/staff/kathrin', (req, res) =>{
    res.render('staff/kathrin')})

//etc..

我的观点是

/views/
   home.handlebars
   about.handlebars
   /staff/
      kathrin.handlebars

因此,如果请求的路径对应于我的 /views/ 目录中的车把模板,我正在寻找一种自动化这些路线的方法。我显然需要一种方法来偏离该行为,因为某些模板需要 more/different 上下文,并且某些路径具有不同的功能。有某种中间件可以做到这一点吗?

好吧,您可以编写一些相当简单的中间件来为您完成这项工作:

function render(req, res, next) {
    let path = req.originalUrl;
    // remove any query string
    let index = path.indexOf("?");
    if (index >= 0) {
        path = path.slice(0, index);
    }
    // for safety purposes, need to also skip any paths with ".." in it
    if (path.indexOf("..") >= 0) {
        next();
        return;
    }

    // remove leading /
    path = path.slice(1);

    // let res.render() tell us whether the file exists or not
    res.render(path, (err, html) => {
        if (err) {
            next();
        } else {
            res.send(html);
        }
    });
}

app.use(render);

努力让 jfriend00 的回答更精彩 elegant/compact。想法是他的,不是我的。所以:

let viewsRouter = (req, res, next) => {
    // Path without the initial slash ("/") and removing the unsafe ".."
    let requestedPath = req.path.slice(1).replace(/\.\./g,'');
    // Now, try to render view
    res.render(requestedPath, (err,html)=>{     
        if (err) {next()}       // Not found. Check if next route applies
        else {res.send(html)}   // Found. Render view
    });
};
app.use(viewsRouter)