Nodejs中jade的layout.jade如果要访问,是不是每个路由里面都要把 req.session.user 传进去?
Nodejs中jade的layout.jade如果要访问,是不是每个路由里面都要把 req.session.user 传进去?
比如网站导航的 用户登陆登出 要判断 session.user , 这个值除了每个路由中都把req.session.user 传进去,还有别的办法吗?
在Node.js中使用Jade(现在称为Pug)模板引擎时,如果你希望在全局的layout.jade
文件中访问用户会话信息(例如req.session.user
),通常需要将该信息传递给每个视图。然而,有一种更优雅的方法来避免在每个路由中重复传递相同的数据。
解决方案:中间件
我们可以创建一个中间件,用于在每次请求时自动将req.session.user
添加到渲染上下文中。这样,你就不需要在每个路由中手动传递这个数据了。
示例代码:
- 创建中间件
// app.js 或其他主要的服务器文件
const express = require('express');
const app = express();
// 创建中间件
app.use((req, res, next) => {
res.locals.user = req.session.user; // 将用户信息添加到 res.locals 中
next();
});
- 在布局文件中使用
在你的layout.pug
文件中,你可以直接访问user
变量:
doctype html
html
head
title= title
body
nav
if user
p Logged in as: #{user.username}
else
p Not logged in
block content
- 路由示例
即使你不显式地将req.session.user
传递给视图,它仍然可以被layout.pug
访问:
// routes.js 或其他路由定义文件
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.render('index', { title: 'Home Page' });
});
module.exports = router;
在这个例子中,res.locals.user
会在每个请求中自动设置,因此你不需要在每个路由中手动传递req.session.user
。
总结
通过创建一个中间件来自动将req.session.user
添加到res.locals
中,你可以避免在每个路由中重复传递相同的数据。这种方法不仅简化了代码,还提高了可维护性。
在Node.js应用中使用Jade(现在称为Pug)模板引擎时,如果你希望在布局文件layout.jade
中访问会话信息(例如req.session.user
),确实需要将该信息传递给每个视图。不过,你可以通过中间件来简化这个过程,从而避免在每个路由处理函数中手动传递req.session.user
。
示例代码
假设你已经设置好了基本的Express应用,并且使用了会话中间件(如express-session
)。以下是如何设置一个中间件来自动将req.session.user
传递给所有视图:
const express = require('express');
const session = require('express-session');
const app = express();
// 使用session中间件
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: true
}));
// 设置view engine为pug
app.set('view engine', 'pug');
// 定义一个中间件来为所有视图添加会话信息
app.use((req, res, next) => {
res.locals.user = req.session.user;
next();
});
// 假设这是你的路由定义
app.get('/', (req, res) => {
res.render('home', { title: '主页' });
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
在这个例子中,我们定义了一个中间件app.use
,它会在每次请求处理之前运行。这个中间件将req.session.user
赋值给res.locals.user
。res.locals
对象用于存储在渲染视图之前可被视图访问的数据,这样你就不需要在每个路由处理函数中显式地传递req.session.user
了。
Pug模板中的使用
在你的布局文件(如layout.pug
)或任何其他视图文件中,你可以通过user
变量访问到会话中的用户信息:
doctype html
html
head
title= title
body
if user
p 欢迎,#{user.username}!
else
p 未登录
block content
这种方式可以使代码更整洁,减少重复工作。