Nodejs req.flash('中文').toString()乱码
Nodejs req.flash(‘中文’).toString()乱码
我用express和ejs写了一个登录,写到提示信息的时候出现了这个问题。ejs固定的中文没有乱码,文件保存的也是utf-8的编码,一用req.flash(‘中文’).toString()的时候页面就乱码了。英文和数字都正常显示
Node.js req.flash('中文').toString()
乱码问题
在使用 Express 和 EJS 渲染模板时,如果在使用 req.flash
方法传递中文信息时出现乱码问题,这通常是由于字符编码设置不当导致的。以下是一些可能的原因和解决方法:
原因分析
- 字符编码不一致:确保所有涉及到的文件(包括服务器端和客户端)都使用相同的字符编码(如 UTF-8)。
- Flash 模块配置问题:确保你使用的 flash 模块(如
connect-flash
)正确处理了字符编码。
解决方案
首先,确保你的项目依赖中包含 connect-flash
,如果没有,可以通过 npm 安装:
npm install connect-flash --save
然后,在你的 Express 应用中进行如下配置:
const express = require('express');
const session = require('express-session');
const flash = require('connect-flash');
const app = express();
// 使用 session 中间件
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: true
}));
// 使用 flash 中间件
app.use(flash());
// 设置视图引擎为 EJS
app.set('view engine', 'ejs');
// 设置中间件以支持解析 URL 编码的请求体
app.use(express.urlencoded({ extended: true }));
// 示例路由
app.get('/login', (req, res) => {
// 将中文信息存储到 flash 中
req.flash('info', '登录成功');
res.redirect('/dashboard');
});
app.get('/dashboard', (req, res) => {
// 获取并渲染 flash 信息
const info = req.flash('info');
res.render('dashboard', { info });
});
// 启动服务器
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
EJS 模板示例
在你的 EJS 模板文件(例如 dashboard.ejs
)中,确保正确地渲染 flash 信息:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Dashboard</title>
</head>
<body>
<% if (info.length > 0) { %>
<div><%= info[0] %></div>
<% } %>
</body>
</html>
总结
通过确保服务器和客户端都使用 UTF-8 编码,并正确配置 connect-flash
中间件,可以有效解决 req.flash('中文').toString()
乱码问题。上述代码展示了如何正确设置 Express 应用,并在 EJS 模板中正确渲染 flash 信息。
为什么要用中文?
提示一些报错信息 ,比如 注册失败 什么的
if(password != password_re){
req.flash('error','密码不一致');
return res.redirect('/reg');
}
这个密码不一致到页面上就成乱码了
解决了。路由里的js没有保存为utf-8的编码。。。。
当你使用 req.flash
方法传递包含中文字符的信息时,可能会遇到乱码问题。这通常是由于编码设置不正确导致的。你需要确保在整个处理过程中使用的字符编码是一致的,特别是从客户端发送请求到服务器处理再到返回给客户端的过程中。
解决方案
-
确保EJS模板引擎配置为UTF-8编码: 确保你的EJS模板引擎被正确地配置为UTF-8编码。通常情况下,EJS默认支持UTF-8编码,但你可以显式地设置它。
-
确保Flash插件的编码一致: 使用
connect-flash
或其他类似的中间件时,确保这些中间件正确处理字符编码。 -
检查HTTP响应头: 确保HTTP响应头中的
Content-Type
字段设置为text/html; charset=utf-8
。
示例代码
const express = require('express');
const session = require('express-session');
const flash = require('connect-flash');
const app = express();
// 配置session
app.use(session({
secret: 'your_secret_key',
resave: false,
saveUninitialized: true
}));
// 初始化flash
app.use(flash());
// 设置视图引擎为EJS
app.set('view engine', 'ejs');
// 设置EJS为UTF-8编码
app.locals.charset = 'utf-8';
// 路由处理
app.post('/login', (req, res) => {
// 模拟登录失败的情况
req.flash('error', '登录失败,请检查用户名或密码');
res.redirect('/login');
});
app.get('/login', (req, res) => {
// 渲染登录页面并传递错误信息
res.render('login', { messages: req.flash('error') });
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
EJS模板示例
在你的 login.ejs
文件中,确保正确地渲染传递过来的消息:
<!DOCTYPE html>
<html>
<head>
<title>Login Page</title>
<meta charset="utf-8">
</head>
<body>
<% if (messages.length > 0) { %>
<div><%= messages.join(', ') %></div>
<% } %>
<form action="/login" method="post">
<!-- 表单字段 -->
<button type="submit">登录</button>
</form>
</body>
</html>
通过上述步骤和代码示例,你应该能够解决 req.flash('中文').toString()
出现的乱码问题。