Express & Handlebars 的全球属性

2024-03-08

我使用 Handlebars(使用express3-handlebars)作为模板,使用 Passport 在 NodeJS 应用程序中进行身份验证。一切都很好,但我想知道是否有一种方法可以将 Passport 创建的 req.user 对象全局传递到 Handlebars。

所以我的标题部分可能看起来像这样:

<header>
    <h1>My Title</h1>
    {{#if user}}
        <p>Hello {{user.name}}</p>
    {{else}}
        <p>Please <a href='/login'>Log In</a></p>
    {{/if}}
</header>

按照目前的情况,我必须在每个页面渲染时显式传递用户对象:

app.get('/', function(req, res){
    res.render('home', {
        page_title: 'welcome',
        user: req.user
    }); 
});

这似乎是错误的方法,因为我在每个页面上都需要它,我是否可以只设置一次并让所有页面都可以访问它?

当我实例化 Handlebars 时,我无法执行此操作,因为它依赖于使用 Passport 登录的用户,但情况并非总是如此。

创建一个全局“page_options”对象,将其附加并传递给每个渲染是否是正确的解决方案,或者 Handlebars/Express 是否有办法处理这个问题?


我之前没有亲自使用过 Passport,但根据 Passport README 以及我对其他身份验证方案所做的操作,这应该可行。

快车3

app.configure(function() {
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(function(req, res, next) {
        res.locals.user = req.user; // This is the important line

        next();
    });
    app.use(app.router);
});

快车4

app.use(passport.initialize());
app.use(passport.session());
app.use(function(req, res, next) {
    res.locals.user = req.user; // This is the important line

    next();
});

基本上,在渲染之前,您的app.locals, res.locals,以及您传递到渲染函数(第二个参数)的局部变量都将被组合并传递到您的视图引擎。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Express & Handlebars 的全球属性 的相关文章

随机推荐

  • 正则表达式模式忽略多个文件夹

    忽略多个文件和文件夹的正确语法是怎样的电子包装机 https www npmjs com package electron packager 只有一个参数 例如 ignore docs 效果很好 但我想忽略多个文件夹和文件 例如 ignor
  • R中如何判断列表是否为空?

    本质上 我有一个创建 list 输出的函数 我希望我的函数不创建 list 而是用另一个值 例如 NULL 或字符串 替换它 有没有办法确定变量是否分配给空列表list 空列表为空 它没有元素 但仍然是一个列表 没有元素的列表的长度为 0
  • 如何解决 ClassNotFoundException?

    我正在尝试运行 Java 应用程序 但收到此错误 java lang ClassNotFoundException 冒号后面是缺少的类的位置 但是 我知道该位置不存在 因为该类位于其他地方 我怎样才能更新该类的路径 和类路径有关系吗 类路径
  • 我如何将小胡子中的变量大写

    我的小胡子模板中有一个名为 type 的变量 我想使用标题大小写将 type 的值大写 这可能吗 考虑到该类型不是网页上显示的类型 它存储一个值 type 你可以将它包裹在一个span并使用CSS CSS capitalize text t
  • 用C语言从M68k RAM地址获取特定字节

    通过 IDA 反汇编程序我到达了这个地址 0010FD74 00 00 00 00 00 00 03 00 00 00 00 00 82 03 80 02 现在我需要给定地址来获取特定字节 例如第 7 个位置有 03 我尝试过使用C语言来做
  • Android:将imageview转换为位图,转换为灰度,位图转换为imageview

    当我编译此代码时 我没有在 Eclipse 上收到任何警告 但是当我在设备或模拟器上运行它时 该程序被迫关闭 public class MainActivity extends Activity ImageView img Button b
  • 如何卸载 Ruby on Rails 并进行全新安装?

    我正在学习 Rails 教程 我遇到 RVM 版本问题并且收到很多错误 我想从 Ruby Rails Gemfiles 等的干净版本开始 谁能给我一些关于如何卸载 Ruby on Rails 环境的简短说明 尝试这个 rvm get hea
  • 在 PHP 7 中全局启用“strict_types”

    我目前正在将我的网站从 PHP5 迁移到 PHP7 并且我已经开始使用添加的严格类型功能 然而 这要求我以下行开头所有文件
  • 如何在 macOS 沙盒环境中从 C++ 运行 AppleScript 而不会侵犯权利

    我正在尝试使用AppleScript来控制ApplePhotos来自 QT C 应用程序中的应用程序 该应用程序必须在 macOS App Store 所需的沙箱环境中运行 我尝试通过 QProcess 启动来运行 AppleScripto
  • 如何使 CDT/Eclipse 与 C++11 线程一起工作?

    我尝试在 Eclipse 中测试 C 11 线程的示例 但我在运行程序时收到此消息 抛出 std system error 实例后调用终止 什么 不允许操作 我的系统 ubuntu gcc 4 7 Program include
  • Ksoap2 Android - 如何为复杂对象的子属性指定命名空间?

    我正在尝试使用 KSoap2 Android 将复杂对象上传到 WCF Web 服务 但执行此操作时遇到一些困难 当我使用SoapUI并手动填写数据时 我已经成功调用了Web服务 成功的SoapUI生成的请求如下
  • 错误 - Jenkins 检测到正在运行多个实例

    我正在将 Jenkins 作为 Windows 服务运行 一切都很好 突然从今天中午开始 我在打开它时开始看到以下错误 Jenkins 检测到您似乎正在运行多个实例 Jenkins 共享相同的主目录 这 詹金斯非常困惑 你可能会遇到奇怪的情
  • 构建期间生成 T4 代码,自定义程序集参考

    我有一个 T4 模板 可以处理项目中的多个 tt 文件 我还定义了一些自定义类来帮助完成代码转换过程 lt template language C hostspecific True debug True gt lt output exte
  • 应该使用哪个:数组与链表?

    我计划实现一个有界队列而不使用Queue
  • Google Cloud 公共主机名

    是否有任何解决方案可以像其他云平台一样在谷歌云中获取公共主机名 目前机器名称是 计算机名 c googleprojectid internal 但我想要类似在亚马逊或Azure中的东西 计算机名 cloudapp net 您可以使用谷歌云D
  • 选择没有任何类的元素[重复]

    这个问题在这里已经有答案了 我需要通过 jQuery 选择器找到页面中没有类的所有跨度 Example span class Cool do not found me span span me me take me please span
  • Azure Functions - 导入自定义节点模块

    我正在尝试使用 Azure Functions 我正在尝试在我的函数中使用第三方节点模块 但是 我一直无法弄清楚如何导入它 id aaaaaaaa bbbb cccc dddd eeeeeeeeeeee requestId aaaaaaaa
  • Django 测试:测试表单字段的初始值

    我有一个观点 应该根据 GET 值为表单字段设置初始值 我想测试一下 我目前正在使用Django的测试客户端 http docs djangoproject com en dev topics testing module django t
  • 是否有命令行的版本控制系统抽象?

    现在 如此多的小型开源项目通过其版本控制系统 发布 我有数十个经常需要的存储库 通常位于多台计算机上 我正在寻找某种方法来轻松管理这个问题 如果我自己设计它 我将有一个列出所有远程存储库的文件 以及一个自动从它们中提取的命令行客户端 这个或
  • Express & Handlebars 的全球属性

    我使用 Handlebars 使用express3 handlebars 作为模板 使用 Passport 在 NodeJS 应用程序中进行身份验证 一切都很好 但我想知道是否有一种方法可以将 Passport 创建的 req user 对