快速获取路线:如何实现DRY



我有下面这样的代码来获取进程路径

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吗?

谢谢。

最多可以将这些get调用链接起来。

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

此外,还有一条建议:不要试图成为一个代码完美主义者。这会毁了你的学习。欢迎来到现实世界。它有点脏。

当在重复函数中使用许多相似的数据时,可以使整件事表驱动,这是一种goto技术:

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

您可以创建一个辅助函数,该函数将帮助您渲染模板。

类似于:

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

然后,使用路由器中的功能:

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

我发现了另一个类似的解决方案,如下

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方法,并且可以根据您的要求更新相应的对象,从而不断更新新的路由。

希望能有所帮助。

最新更新