【问题标题】:node.js EJS - Data in partial which is used multiple timesnode.js EJS - 多次使用的部分数据
【发布时间】:2021-07-18 16:58:20
【问题描述】:

我正在寻找有关我的 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
    });
});

【问题讨论】:

    标签: javascript node.js express ejs


    【解决方案1】:

    我可以提出两个改进建议:

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

    【讨论】:

    • 嗨,Kelvin,感谢您的建议!我忘记指出我已经在使用包含系统了——但还是谢谢你;)我也考虑过“默认数据功能”,但正在寻找更优雅的解决方案。如果没有其他可能,我会坚持使用您的“默认数据功能”,因为这是迄今为止最好的方法!
    • 然后,除了使现有的更容易/更清洁,并且不放弃 EJS,唯一的选择是“反转包含”,基本上有一个主模板,您可以在其中嵌入页面模板,例如res.render("app/layout", { page: 'app/system/users', ...pageData }); 其中布局模板包含目标页面。
    • 反转包含的有趣方法!想象一下我会放弃 EJS,哪些替代方案可以提供更好的支持或方法来“解决”我的问题?
    • 很久没有使用 Express 模板了。那时,我使用了与 EJS 非常相似的东西(Phantom?忘记了名字,但你会遇到完全相同的问题)。我所知道的唯一其他框架组合基本上是用 React 替换 EJS:一个 PWA(单页 Web 应用程序),它执行 REST 请求(或者 GraphQL,如果那是你的东西)以从/在服务器上获取/修改数据。现在 PWA 有点标准,但它当然与 EJS 大不相同。您从服务器端渲染转到客户端渲染。现在您需要传输要呈现的数据而不是纯 HTML。
    • 嗯,好像我已经到了某个地方,模板语言不再满足我将干净简单的代码推向世界的需求;)我会坚持使用“defaultDataFunction”方法对于这个应用程序,并将花时间为未来的项目学习 React。非常感谢您的这次谈话!
    猜你喜欢
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多