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值,请问大家问题可能出现在哪里??
Nodejs express3 用flash存取值的时候,在模板页面获取的都是undefined值
问题描述
在使用Express 3.x时,尝试通过req.flash()
来存储和读取闪现消息(flash messages),但在模板页面中总是获取到undefined
值。这可能是由于配置或使用方法上的某些错误。
可能的原因及解决方案
-
缺少中间件:
- 确保已经安装并正确引入了
connect-flash
中间件。这是用来处理闪现消息的核心库。
npm install connect-flash --save
- 确保已经安装并正确引入了
-
正确配置中间件:
- 在应用中正确地配置
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(); }); // 路由定义等...
- 在应用中正确地配置
-
设置闪现消息:
- 确保在适当的地方设置了闪现消息,例如在一个路由处理函数中。
// 设置闪现消息 app.get('/login', function(req, res) { req.flash('error', '用户名或密码错误'); res.redirect('/'); // 重定向后闪现消息会被传递 });
-
在EJS模板中正确访问闪现消息:
- 在EJS模板中,应该直接访问
messages
对象而不是locals.error
。因为闪现消息可以包含多个键值对。
<!-- ejs 文件 --> <% if (messages.error) { %> <div class="alert alert-error"> <%= messages.error[0] %> <!-- 获取第一个错误信息 --> </div> <% } %>
- 在EJS模板中,应该直接访问
通过以上步骤,你应该能够正确地存储和获取闪现消息,并在模板页面中显示它们。确保遵循正确的顺序和方法,特别是中间件的加载顺序和闪现消息的设置方式。
你看看下面这个链接文章对你有木有帮助 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
。