Express: Automati c Просмотр маршрутизации - PullRequest
0 голосов
/ 22 февраля 2020

Можно ли создать маршрут, который автоматически направляет запросы на путь, соответствующий шаблону, отображаемому на стороне сервера? Вроде как app.use(express.static(__dirname + '/public')) делает для stati c содержимого?

Я имею в виду, что я использую руль:

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 /. Очевидно, мне нужен способ отклониться от этого поведения, поскольку некоторым шаблонам потребуется больше / другой контекст, а также некоторые пути имеют разную функциональность. Есть ли какое-то промежуточное программное обеспечение, которое делает это?

1 Ответ

0 голосов
/ 22 февраля 2020

Ну, вы можете написать довольно простое промежуточное программное обеспечение, которое сделает это за вас:

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);
...