NodeJS 是否可以在浏览器中设置一个事件侦听器来捕获从res.render返回的值?

j8yoct9x  于 2023-01-25  发布在  Node.js
关注(0)|答案(1)|浏览(115)
    • 理想行为**

我有一个使用Azure AD B2C登录的Node. js/Express应用程序。
我想返回从服务器端返回的值,OAuth样式,登录浏览器并将它们保存在浏览器cookie中(使用js-cookie)。
我希望这样做,以便可以在各种UI功能中使用这些值。
但是,目前唯一返回到浏览器的是通过res. render()(使用simple template engine):

res.render('index', { page_html: my_page_html, some_other_value: 'hello'  });

实际上,res.render向浏览器返回一个html文件,其中包含占位符值,这些值将被传递到res.render的变量替换。
是否可以在浏览器中设置一个事件侦听器来捕获从res.render返回的值?
或者,如果这不可能,是否有其他方法可以将值"推送"到前端(与res.render并行),以便由前端代码处理?

    • 背景**

以前,在其他项目中,我从前端向后端发出Ajax请求,因此可以轻松地访问从服务器返回的内容,然后可以在响应处理程序逻辑中使用这些内容,并保存在浏览器cookie等文件中。
但是,在这个示例中,我从后端代码执行所有登录逻辑,因此没有从前端到后端的特定请求,前端中也没有响应处理程序。
所以我不确定如何将后端(登录后)接收到的值传递到前端。
身份验证过程遵循常见的OAuth工作流:

  • 用户点击受保护端点-在这种情况下是"根"端点(即:/
  • 用户被转发到身份提供程序进行登录(在本例中为Azure AD B2C)
  • 成功登录后,用户将被转发到重定向URI,并在服务器端代码中接收授权代码
  • 服务器端代码使用授权代码来请求访问令牌
  • 访问令牌保存在req.session.accessToken
  • 在对受保护端点的后续请求中,如果存在req.session.accessToken,则请求可以继续

本项目不使用任何JavaScript框架(如React,Angular)。

5n0oy7gb

5n0oy7gb1#

您只需使用res.render()方法的回调函数在响应上设置一个cookie,然后在调用res.send()之前在该方法内部调用res.cookie()
浏览器将按预期保存cookie,然后您可以使用js-cookie访问该cookie。
作为参考,您需要执行以下操作

res.render('index', { /* locals */ }, function (err, html) {
  res.cookie('key', 'value');
  res.send(html);
);

相关问题