Nodejs express3 用flash存取值的时候,在模板页面获取的都是undefined值

Nodejs express3 用flash存取值的时候,在模板页面获取的都是undefined值

app.js

app.use(function (req,res,next) {
var err = req.flash('error');
res.locals.error = err.length ? err : null;
next();

});

ejs文件中

<%= locals.error %>

获取的都是undefined值,请问大家问题可能出现在哪里??


4 回复

Nodejs express3 用flash存取值的时候,在模板页面获取的都是undefined值

问题描述

在使用Express 3.x时,尝试通过req.flash()来存储和读取闪现消息(flash messages),但在模板页面中总是获取到undefined值。这可能是由于配置或使用方法上的某些错误。

可能的原因及解决方案

  1. 缺少中间件:

    • 确保已经安装并正确引入了connect-flash中间件。这是用来处理闪现消息的核心库。
    npm install connect-flash --save
    
  2. 正确配置中间件:

    • 在应用中正确地配置connect-flash。通常需要在设置路由之前将其添加到中间件链中。
    // app.js
    var express = require('express');
    var flash = require('connect-flash');
    
    var app = express();
    
    // 配置中间件
    app.use(express.cookieParser('your secret here'));
    app.use(express.session());
    app.use(flash());
    
    // 使用闪现消息的中间件
    app.use(function (req, res, next) {
        res.locals.messages = req.flash(); // 将闪现消息传递给视图
        next();
    });
    
    // 路由定义等...
    
  3. 设置闪现消息:

    • 确保在适当的地方设置了闪现消息,例如在一个路由处理函数中。
    // 设置闪现消息
    app.get('/login', function(req, res) {
        req.flash('error', '用户名或密码错误');
        res.redirect('/'); // 重定向后闪现消息会被传递
    });
    
  4. 在EJS模板中正确访问闪现消息:

    • 在EJS模板中,应该直接访问messages对象而不是locals.error。因为闪现消息可以包含多个键值对。
    <!-- ejs 文件 -->
    <% if (messages.error) { %>
        <div class="alert alert-error">
            <%= messages.error[0] %> <!-- 获取第一个错误信息 -->
        </div>
    <% } %>
    

通过以上步骤,你应该能够正确地存储和获取闪现消息,并在模板页面中显示它们。确保遵循正确的顺序和方法,特别是中间件的加载顺序和闪现消息的设置方式。


你看看下面这个链接文章对你有木有帮助 http://www.cnblogs.com/meteoric_cry/archive/2012/07/23/2604890.html

flash的值要传递给view,要依赖二传手session。session的中间件启用了吗

在这个问题中,req.flash('error') 返回的是一个数组,即使数组为空。因此,当你尝试访问 err.length 时,由于 err 是一个数组而不是字符串或 undefined,它不会返回 undefined,而是会返回 0。然而,如果你尝试直接在 EJS 模板中输出 locals.error,并且它是一个数组,那么它可能会显示为 [object Object] 或其他形式的数组表示,而不是 undefined

但是,根据你的描述,你在模板中看到的是 undefined,这可能是因为 locals.error 没有正确设置。我们可以通过确保在没有错误信息时,将 locals.error 显式设置为 null 来解决这个问题。

示例代码

app.js

const express = require('express');
const flash = require('connect-flash');

const app = express();

// 使用 flash 中间件
app.use(flash());

app.use(function (req, res, next) {
    // 获取 flash 中的 error 信息
    var err = req.flash('error');
    // 将 error 设置到 res.locals 中
    res.locals.error = Array.isArray(err) && err.length > 0 ? err[0] : null;
    next();
});

// 路由示例
app.get('/', function (req, res) {
    req.flash('error', '这是一个错误消息');
    res.render('index');
});

app.listen(3000);

index.ejs

<!DOCTYPE html>
<html>
<head>
    <title>Flash Test</title>
</head>
<body>
    <% if (error) { %>
        <p><%= error %></p>
    <% } else { %>
        <p>没有错误</p>
    <% } %>
</body>
</html>

在这个例子中,我们确保了只有当 err 数组中有元素时,才将其赋值给 locals.error,否则将其设置为 null。这样可以避免在模板中看到 undefined

回到顶部