繁体   English   中英

带有动态内容的Express + Jade服务器端模板与缓存/ 304

[英]express + jade server-side templates with dynamic content vs. caching / 304

我有一个在前端使用angularjs的expressjs应用程序,我在express中提供玉器,即

app.set('view engine', 'jade');

我也使用带角的玉子。 该应用程序基于Yeoman角全堆栈生成器

这是生成器的演示应用程序中指向navbar.html部分的链接,以供参考(除非我使用的是Jade)

我通过快速中间件将当前登录的用户服务器端注入模板引擎,以将其添加到res.locals,以便在运行时可以在模板中使用它。

app.get('/partials/*', function(req, res, next) { 
  res.locals.user = req.user; next(); 
}, index.partials);

现在,此应用具有用户角色,我们假设有两个角色: ['user', 'admin'] ,我想根据当前用户的角色有条件地从navbar.jade输出标记。

例如,如下所示( 管理员用户应只看到admin菜单项 ):

ul.nav
  if user
    li
      a(href='/settings')
  if (user && user.role == 'admin')
    li
      a(href='/admin')

我知道我可以ng-hide / ng-show这些链接与Angular一起使用,但是如果用户不应该使用它们,我宁愿不输出标记(它们也受服务器端保护) )

因此,这种方法有点奏效。 如果我以普通用户身份登录,则导航栏很好,然后我注销,然后以管理员用户身份重新登录,但是浏览器发出对navbar.html的请求,ExpressJS返回304 Not Modified ,因此内容陈旧。 如果我刷新/ F5,它将根据用户角色返回正确的版本(即,刷新时会解释未缓冲的Jade JavaScript)。

我正在尝试找出如何强制执行。 我可以尝试使用缓存控制标头和Etag禁用黑客,但是我正在尝试解决一种干净的方法来解决此问题。

回答我自己的问题。 问题不在于Jade / Express-问题在于以下代码:

div(ng-include="/partials/navbar")

当用户注销/登录时,我误认为浏览器正在从服务器发出新的部分请求。 Chrome DevTools的网络标签显示请求为304 Not Modified但仔细检查后,服务器未收到该请求。 为了解决这个问题,我现在将ng-include source属性绑定到一个范围变量,当用户注销/登录时,我刷新范围变量以强制angular发出新请求,然后Jade / Express执行模板并响应并更新了符合我期望的部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM