Nodejs req.flash('中文').toString()乱码

Nodejs req.flash(‘中文’).toString()乱码

我用express和ejs写了一个登录,写到提示信息的时候出现了这个问题。ejs固定的中文没有乱码,文件保存的也是utf-8的编码,一用req.flash(‘中文’).toString()的时候页面就乱码了。英文和数字都正常显示

6 回复

Node.js req.flash('中文').toString() 乱码问题

在使用 Express 和 EJS 渲染模板时,如果在使用 req.flash 方法传递中文信息时出现乱码问题,这通常是由于字符编码设置不当导致的。以下是一些可能的原因和解决方法:

原因分析

  1. 字符编码不一致:确保所有涉及到的文件(包括服务器端和客户端)都使用相同的字符编码(如 UTF-8)。
  2. 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 方法传递包含中文字符的信息时,可能会遇到乱码问题。这通常是由于编码设置不正确导致的。你需要确保在整个处理过程中使用的字符编码是一致的,特别是从客户端发送请求到服务器处理再到返回给客户端的过程中。

解决方案

  1. 确保EJS模板引擎配置为UTF-8编码: 确保你的EJS模板引擎被正确地配置为UTF-8编码。通常情况下,EJS默认支持UTF-8编码,但你可以显式地设置它。

  2. 确保Flash插件的编码一致: 使用 connect-flash 或其他类似的中间件时,确保这些中间件正确处理字符编码。

  3. 检查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() 出现的乱码问题。

回到顶部