Nodejs中jade的layout.jade如果要访问,是不是每个路由里面都要把 req.session.user 传进去?

Nodejs中jade的layout.jade如果要访问,是不是每个路由里面都要把 req.session.user 传进去?

比如网站导航的 用户登陆登出 要判断 session.user , 这个值除了每个路由中都把req.session.user 传进去,还有别的办法吗?

2 回复

在Node.js中使用Jade(现在称为Pug)模板引擎时,如果你希望在全局的layout.jade文件中访问用户会话信息(例如req.session.user),通常需要将该信息传递给每个视图。然而,有一种更优雅的方法来避免在每个路由中重复传递相同的数据。

解决方案:中间件

我们可以创建一个中间件,用于在每次请求时自动将req.session.user添加到渲染上下文中。这样,你就不需要在每个路由中手动传递这个数据了。

示例代码:

  1. 创建中间件
// app.js 或其他主要的服务器文件
const express = require('express');
const app = express();

// 创建中间件
app.use((req, res, next) => {
    res.locals.user = req.session.user; // 将用户信息添加到 res.locals 中
    next();
});
  1. 在布局文件中使用

在你的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
  1. 路由示例

即使你不显式地将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.userres.locals对象用于存储在渲染视图之前可被视图访问的数据,这样你就不需要在每个路由处理函数中显式地传递req.session.user了。

Pug模板中的使用

在你的布局文件(如layout.pug)或任何其他视图文件中,你可以通过user变量访问到会话中的用户信息:

doctype html
html
  head
    title= title
  body
    if user
      p 欢迎,#{user.username}!
    else
      p 未登录
    block content

这种方式可以使代码更整洁,减少重复工作。

回到顶部