node.js EJS - 部分数据被多次使用
node.js EJS - Data in partial which is used multiple times
我正在寻找有关我的 nodejs 项目的建议。
我为需要显示一些用户数据的侧边栏制作了一部分。这个侧边栏在我项目的许多页面中被多次使用。为了将用户数据发送到部分,我总是需要将它包含在我呈现使用侧边栏的页面的每个函数中。
我现在正在寻找更好的解决方案,让我将数据包含在一个地方,部分可以在使用边栏的每个页面上使用这些数据。
这种方法甚至可以通过组合 nodejs/express/ejs 还是我在寻找不可能的东西?
示例代码来说明我的问题:
部分(边栏):
<ul id="sidebarnav">
<% if(user) { %>
<li class="user-pro">
<ul aria-expanded="false" class="collapse">
<li><a href="/user/profile?id=<%= user.uuid %>"><i class="ti-user"></i> My Profile</a></li>
<li><a href="/auth/logout"><i class="fa fa-power-off"></i> Logout</a></li>
</ul>
</li>
<% } %>
<% if(user && user.permission.includes("ADMINISTRATION")) { %>
<li>
<a class="waves-effect waves-dark" href="/system/users" aria-expanded="false">
<i class="ti-user"></i>
<span class="hide-menu">Users</span>
</a>
</li>
<% } %>
</ul>
部分使用侧边栏的页面:
router.get("/", authMiddleware.checkAuth, (req, res) => {
res.render("app/index", {
user: req.session.user
});
});
router.get("/system/users", authMiddleware.checkAuth, (req, res) => {
res.render("app/system/users", {
user: req.session.user
});
});
我可以提出两个改进建议:
- EJS 有一个include 系统,基本上是将模板嵌入到模板中。这使得您无需一遍又一遍地复制边栏代码,只需包含它即可。
- 服务器端,您可以使用一个简单的“实用程序”函数来将“默认”数据添加到您的渲染中:
function getDefaultData(req) {
return { user: req.session.user; };
}
router.get("/", authMiddleware.checkAuth, (req, res) => {
res.render("app/index", getDefaultData(req));
});
router.get("/system/users", authMiddleware.checkAuth, (req, res) => {
res.render("app/system/users", {
...getDefaultData(req), // Inject all the default data
users: getAllUsers(), // Add data specific to this page
});
});
我正在寻找有关我的 nodejs 项目的建议。 我为需要显示一些用户数据的侧边栏制作了一部分。这个侧边栏在我项目的许多页面中被多次使用。为了将用户数据发送到部分,我总是需要将它包含在我呈现使用侧边栏的页面的每个函数中。
我现在正在寻找更好的解决方案,让我将数据包含在一个地方,部分可以在使用边栏的每个页面上使用这些数据。
这种方法甚至可以通过组合 nodejs/express/ejs 还是我在寻找不可能的东西?
示例代码来说明我的问题:
部分(边栏):
<ul id="sidebarnav">
<% if(user) { %>
<li class="user-pro">
<ul aria-expanded="false" class="collapse">
<li><a href="/user/profile?id=<%= user.uuid %>"><i class="ti-user"></i> My Profile</a></li>
<li><a href="/auth/logout"><i class="fa fa-power-off"></i> Logout</a></li>
</ul>
</li>
<% } %>
<% if(user && user.permission.includes("ADMINISTRATION")) { %>
<li>
<a class="waves-effect waves-dark" href="/system/users" aria-expanded="false">
<i class="ti-user"></i>
<span class="hide-menu">Users</span>
</a>
</li>
<% } %>
</ul>
部分使用侧边栏的页面:
router.get("/", authMiddleware.checkAuth, (req, res) => {
res.render("app/index", {
user: req.session.user
});
});
router.get("/system/users", authMiddleware.checkAuth, (req, res) => {
res.render("app/system/users", {
user: req.session.user
});
});
我可以提出两个改进建议:
- EJS 有一个include 系统,基本上是将模板嵌入到模板中。这使得您无需一遍又一遍地复制边栏代码,只需包含它即可。
- 服务器端,您可以使用一个简单的“实用程序”函数来将“默认”数据添加到您的渲染中:
function getDefaultData(req) {
return { user: req.session.user; };
}
router.get("/", authMiddleware.checkAuth, (req, res) => {
res.render("app/index", getDefaultData(req));
});
router.get("/system/users", authMiddleware.checkAuth, (req, res) => {
res.render("app/system/users", {
...getDefaultData(req), // Inject all the default data
users: getAllUsers(), // Add data specific to this page
});
});