Nodejs开发指南里面dynamicHelpers函数问题求解

Nodejs开发指南里面dynamicHelpers函数问题求解

各位大虾,请教一个问题:nodejs开发指南注册那里,使用了dynamicHelpers函数,但是因为我现在用的是express3.x,木有这个函数了,请问如何解决啊??? 在网上找了一下,是使用app.use(function(req, res, next){res.locals.user = req.session.user}),可还是出错,总是说user没有定义,无法把会话传到layout.ejs那里。。。。 多谢!

8 回复

当然可以。根据您的描述,您在使用Express 3.x时遇到了dynamicHelpers函数缺失的问题,并且尝试通过app.use来解决这个问题,但仍然遇到了一些错误。下面我将提供一个具体的解决方案,并附上示例代码。

解决方案

在Express 3.x及更高版本中,dynamicHelpers已经被弃用。取而代之的是使用中间件(middleware)来设置模板中的变量。具体来说,您可以使用app.locals或者req.res.locals来全局或局部地设置这些变量。

以下是解决方法的详细步骤:

  1. 设置会话变量:首先确保你已经在应用中正确设置了会话。这通常涉及到使用express-session中间件。

  2. 使用中间件设置模板变量:使用app.use来设置模板中的变量。

示例代码

假设你已经有了一个基本的Express应用,并且已经安装了express, express-session, 和ejs模块。下面是完整的代码示例:

var express = require('express');
var session = require('express-session');

var app = express();

// 配置session中间件
app.use(session({
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: true
}));

// 设置模板引擎为EJS
app.set('view engine', 'ejs');

// 使用中间件设置模板变量
app.use(function(req, res, next) {
    res.locals.user = req.session.user;
    next();
});

// 假设有一个简单的路由
app.get('/', function(req, res) {
    // 在这里你可以设置一些数据给视图
    res.render('index', { title: 'Home' });
});

// 启动服务器
app.listen(3000, function() {
    console.log('App is running on port 3000');
});

解释

  • 配置Session:使用express-session中间件来管理会话。
  • 设置模板变量:通过app.use中间件设置res.locals.user,这样在任何模板文件中都可以访问到user对象。
  • 渲染视图:在路由处理函数中,你可以使用res.render来渲染视图文件,例如index.ejs

通过这种方式,您可以将会话信息传递给布局或其他模板文件,从而避免之前遇到的user未定义的问题。希望这能帮到您!


我也遇到了这个问题,我的解决方案是在res.render里面定义user,不然传不过去。 暂时没找到更好的解决方法

请确认 app.use 是在 router 配置 [ 即 app.get(’/’… ] 之前。

。。。locals不就是为了解决这个问题的么。

解决方案:

将书中app.js的dynamicHelpers代码部分改为:

app.use(function(req, res, next){ var error = req.flash(‘error’); var success = req.flash(‘success’); res.locals.user = req.session.user; res.locals.error = error.length ? error : null; res.locals.success = success ? success : null; next(); });

并把此代码放在 app.use(app.router); 之前。

模板文件中改为下面类似结构: <% if (!locals.user) { %> <% if ( locals.error ) { %> <% if ( locals.success ) { %>

实际上用 res.render("/user",{user: req.session.user}) 不是更优雅吗?

你的这个问题我也遇到过,我特地记录了下来http://www.9958.pw/post/dynamicHelpers_helpers 你也可以看看这篇文章对你也许有帮助 http://www.9958.pw/post/nodejs_lesson (主要是我当时做的demo可以参考参考)

在Express 3.x中,dynamicHelpers 函数已经被移除。你可以通过中间件来实现类似的功能。你提到的 app.use 方法是一个正确的方向,但需要确保你在所有路由之前设置该中间件。

以下是如何设置一个中间件来将用户信息传递给视图:

示例代码

  1. 设置中间件
var express = require('express');
var app = express();

// 使用中间件将用户信息添加到res.locals
app.use(function(req, res, next) {
    res.locals.user = req.session.user;
    next();
});

// 设置模板引擎(例如 EJS)
app.set('view engine', 'ejs');

// 定义一个简单的路由
app.get('/', function(req, res) {
    res.render('index'); // 渲染 index.ejs 模板
});

// 启动服务器
app.listen(3000, function() {
    console.log('Server is running on port 3000');
});
  1. 在视图中使用 user

在你的 layout.ejs 或其他任何EJS模板文件中,你可以直接访问 user 对象:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><%= title %></title>
</head>
<body>
    <% if (user) { %>
        <p>Welcome, <%= user.name %></p>
    <% } else { %>
        <p>Please log in</p>
    <% } %>
    <!-- 其他内容 -->
</body>
</html>

解释

  • 中间件:中间件 function(req, res, next) 在每次请求时运行,并将 req.session.user 添加到 res.locals。这样,在渲染视图时,你可以直接在模板中使用 user 对象。

  • res.locals:这是一个对象,用于存储在渲染视图之前需要传递给视图的数据。通过这种方式,你可以在任何模板中访问 user 对象。

  • 视图模板:在EJS模板中,你可以直接使用 user 对象,就像上面的例子所示。

通过这种方式,你可以实现类似于 dynamicHelpers 的功能,并且能够将会话信息传递到视图中。

回到顶部