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