node.js - 如何为 Express.js 中的每条路线存储变量?

标签 node.js express express-session

因此,我正在构建一个简单的身份验证应用程序,并使用快速 session 来执行此操作。对于用户界面,我需要在导航栏中显示一个用于登录的按钮(如果用户尚未登录),以及一个用于注销的按钮(如果用户已经登录)。

问题是,我不确定如何在所有路由中存储此状态,而不为每个路由使用相同的代码。目前我已经在索引路线上找到了这个,效果很好:

/* GET home page. */
router.get('/', function(req, res, next) {
  var logged_in = false;
  if (req.session.userId) {
    logged_in = true;
  }
  res.render('general/index', { is_logged_in: logged_in});
});

在导航栏中,我动态显示按钮,如下所示:

<% if( is_logged_in){ %>
<li class="nav-item active">
<a class="nav-link" href="/users/logout">Logout<span class="sr-only">(current)</span></a>
</li>
<% } else { %>  
<li class="nav-item active">
<a class="nav-link" href="/login">Login<span class="sr-only">(current)</span></a>
</li>
<% } %>

但问题是,如果我希望它适用于导航栏,我必须为每个路线使用相同的代码,这违背了 DRY 编码实践。如何动态显示此按钮,而不必在每个路由上重复相同的代码,检查用户 session ID 是否存在?我要设置全局变量吗?我是 Express 新手,因此感谢所有帮助。谢谢

最佳答案

您可以设置一个中间件来设置登录状态并使用 res.locals在请求的生命周期内。

function checkLoggedIn(req, res, next) {
  var logged_in = false;
  if (req.session.userId) {
    res.locals.logged_in = true;
  }
}

然后您可以为所有路由挂载它或为某些路由链接它:

// all routes after this middleware:
app.use(checkLoggedIn)

// chain it
app.get('/mypath', checkLoggedIn, (req, res) => { ... })

res.locals 也可供查看,因此您可以执行以下操作,而无需在渲染期间传递。

// You can simply render
res.render('general/index');

// logged_in variable is available to view
<% if(logged_in){ %>

关于node.js - 如何为 Express.js 中的每条路线存储变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56098317/

相关文章:

node.js - 命名空间 'Express' 没有导出成员 'SessionData'

node.js - 如何销毁 session ?

javascript - 在 Node.js 中将 token 传递给另一个请求

javascript - 尝试获取 json 数据,出现 "not a function"错误

node.js - Node JS 查询 request.query 为空

node.js - Amazon Alexa、alexa-app 和中间件

node.js - Heroku 上的 Redis 连接错误 : 127. 0.0.1 而不是 REDIS_URL

node.js - 如何在 node.js 中清除超时

node.js - PM2忽略生态系统文件

javascript - 使用 Node.js 和 multer 上传压缩文件并将其保存到 MySql 数据库时出现问题