Node.js 快速获取路线:如何实现干燥

Node.js 快速获取路线:如何实现干燥,node.js,express,Node.js,Express,我有下面这样的代码来获取进程路径 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( "/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' } );
} );

我觉得我可以再添加一些类似的条目 有什么办法我可以在这里实行干法吗


谢谢。

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

比如:

function renderPage(resObject, template, title = '', data = {}) {
  resObject.render(template, {
    title,
    ...data,
  });
}
然后,使用路由器功能中的功能:

router.get("/todoHome", (req, res) => {
  return renderPage(res, 'todoHome', 'My Todo List!!')
});
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!!')
});
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});
    });
}

充其量,你可以把这些电话连起来

router.get(“/todoHome”,(req,res)=>{
res.render(“todoHome”,
{title:'我的待办事项列表!!'});
})
.get([“/”,“/索引”](请求,恢复)=>{
res.render(“索引”,
{标题:'主页'});
})
.得到(
//......
)

const标题={
“待办事项”:我的待办事项列表,
“索引”:“主页”,
......
}
路由器.get(“*”,(请求,res)=>{
const path=req.path.replace('/','')
res.render(路径,{title:titles[path]});
})

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

充其量,你可以把那些get电话链接起来

router.get(“/todoHome”,(req,res)=>{
res.render(“todoHome”,
{title:'我的待办事项列表!!'});
})
.get([“/”,“/索引”](请求,恢复)=>{
res.render(“索引”,
{标题:'主页'});
})
.得到(
//......
)

const标题={
“待办事项”:我的待办事项列表,
“索引”:“主页”,
......
}
路由器.get(“*”,(请求,res)=>{
const path=req.path.replace('/','')
res.render(路径,{title:titles[path]});
})

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

当在重复函数中使用大量外观相似的数据时,您可以将整个内容设置为表驱动,这是一种goto技术:

router.get("/todoHome", (req, res) => {
  return renderPage(res, 'todoHome', 'My Todo List!!')
});
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});
    });
}

当在重复函数中使用大量类似外观的数据时,您可以使整件事成为表驱动,这是一种goto技术:

router.get("/todoHome", (req, res) => {
  return renderPage(res, 'todoHome', 'My Todo List!!')
});
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});
    });
}

我找到了另一个类似的解决方案,如下所示

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
                } );
        } );
} );
通过这种方式,您不必触摸路由器。获取方法,您可以根据需要更新相应的对象,从而不断更新新路由


希望有帮助。

我找到了另一个类似的解决方案,如下所示

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
                } );
        } );
} );
通过这种方式,您不必触摸路由器。获取方法,您可以根据需要更新相应的对象,从而不断更新新路由


希望有帮助。

@ggorlen,在我的代码中添加了一些现有条目(实际上我排除了它们以保持问题的简单性)谢谢,这对我来说更明显。@ggorlen,在我的代码中添加了一些现有条目(实际上我排除了它们以保持问题的简单性)谢谢,对我来说,这看起来更湿了。比以前更令人兴奋的事情,没有任何理由。只需使用额外的方法,就可以用更多的代码行完成同样的事情。它类似于:
函数consoleLog(string){console.log(string)}consoleLog('hi')
。还有,当除了头衔之外还有别的事情发生时,你会怎么做?毫无理由比以前更令人兴奋的事情。只需使用额外的方法,就可以用更多的代码行完成同样的事情。它类似于:
函数consoleLog(string){console.log(string)}consoleLog('hi')
。另外,当你有其他的东西时,你会怎么做?这比你要求的答案要枯燥得多。所有被接受的答案都是通过链接
.get()
调用来删除对
路由器的一些引用。这就增加了四条代码和一个简单表的所有路由。@ R.Y.D,你考虑了这个解决方案吗?这比你要求的答案要枯燥得多。所有被接受的答案都是通过链接
.get()
调用来删除对
路由器的一些引用。这将使用四行代码和一个简单的表添加所有路由。