express получить маршруты: как достичь DRY - PullRequest
0 голосов
/ 07 мая 2020

У меня есть код, как показано ниже, чтобы получить пути к процессу

router.get( "/todoHome", ( req, res ) => {
    res.render( "todoHome",
        { title: 'My Todo List!!' } );
} );

router.get( "/articles", ( req, res ) => {
    res.render( "articles",
        { title: 'Articles To Read' } );
} );

router.get( ["/", "/index"] ( req, res ) => {
    res.render( "index",
        { title: 'Homepage' } );
} );

router.get( "/primary" ( req, res ) => {
    res.render( "primaryurls",
        { title: 'Primary DC URLs' } );
} );

router.get( "/standby" ( req, res ) => {
    res.render( "standbyurls",
        { title: 'Standby DC URLs' } );
} );

Я чувствую, что могу добавить еще несколько похожих записей. Есть ли способ реализовать здесь DRY?

Спасибо вы.

Ответы [ 4 ]

1 голос
/ 07 мая 2020

В лучшем случае вы можете объединить эти входящие вызовы.

router.get( "/todoHome", ( req, res ) => {
    res.render( "todoHome",
        { title: 'My Todo List!!' } );
})
.get( ["/", "/index"] ( req, res ) => {
    res.render( "index",
        { title: 'Homepage' } );
})
.get(
    //......
)

или

const titles = {
    'todoHome' : 'My Todo List',
    'index': 'Homepage',
    ......
}

router.get("*", ( req, res ) => {
    const path = req.path.replace('/', '')
    res.render( path, { title: titles[path] } );
})

Также совет: не пытайтесь быть перфекционистом кода. Это испортит ваше обучение. Добро пожаловать в реальный мир. Немного грязно.

1 голос
/ 07 мая 2020

Вы можете сделать все это управляемым таблицами, что является техникой перехода, когда у вас есть много похожих данных, используемых в повторяющихся функциях:

const routeData = [
    ['/todoHome', 'todoHome', 'My Todo List!!'],
    ['/articles', 'articles', 'Articles To Read'],
    ['/', 'index', 'Homepage'],
    ['/index', 'index', 'Homepage'],
    ['/primary', 'primaryurls', 'Primary DC URLs'],
    ['/standyby', 'standbyurls', 'Standby DC URLs']
];

// insert routes from the data in the table
for (const [path, name, title] of routeData) {
    app.get(path, (req, res) => {
        res.render(name, {title});
    });
}
0 голосов
/ 07 мая 2020

Я нашел другое подобное решение, как показано ниже

var titleObj = {
    "/kbs": "KB Articles",
    "/articles": "Articles-To-Read"
}

var renderObj = {
    "/kbs": "kbarticles",
    "/articles": "articles",
}

var schemaObj = {
    "/kbs": kbarticlesSchema,
    "/articles": kbarticlesSchema,
}

var routeArray = ["/kbs", "/articles"];

router.get( routeArray, ( req, res ) => {
    console.log( req.path );
    schemaObj[req.path].find()
        .then( ( kbs ) => {
            res.render( renderObj[req.path],
                {
                    title: titleObj[req.path],
                    kbs: kbs
                } );
        } );
} );

Таким образом, вам не нужно прикасаться к методу router.get, и вы можете продолжать обновлять новые маршруты, обновляя соответствующие объекты в соответствии с вашими требованиями.

Надеюсь, это поможет.

0 голосов
/ 07 мая 2020

Вы можете создать вспомогательную функцию, функция поможет вам отобразить ваш шаблон.

Что-то вроде:

function renderPage(resObject, template, title = '', data = {}) {
  resObject.render(template, {
    title,
    ...data,
  });
}

затем используйте функцию в функциях маршрутизатора:

router.get("/todoHome", (req, res) => {
  return renderPage(res, 'todoHome', 'My Todo List!!')
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...