请问大神Nodejs redirect重定向的url中有中文时报错,怎么处理

请问大神Nodejs redirect重定向的url中有中文时报错,怎么处理

如图: 1.png 我是看那个《一起学Node.js》写的blog,但是当写到编号文章时,重定向返回文章页面的url中如果有中文就会出现解码错误,如图: 2.jpg 我有用iconv-lite去解码,但是还是不行

4 回复

针对你在使用 Node.js 进行重定向时遇到的 URL 中含有中文字符导致报错的问题,可以采用 URL 编码的方式来解决。URL 编码是一种将特殊字符转换为安全字符的机制,这样可以确保在重定向时不会因为 URL 的特殊字符而导致错误。

示例代码

首先,你需要安装 querystring 模块,它已经包含在 Node.js 的标准库中,因此不需要额外安装。querystring 模块提供了一些方法来处理查询字符串(即 URL 中的参数部分),包括编码和解码。

const http = require('http');
const url = require('url');
const querystring = require('querystring');

http.createServer((req, res) => {
    const parsedUrl = url.parse(req.url);
    const pathname = parsedUrl.pathname;

    if (pathname === '/redirect') {
        // 假设你有一个包含中文的 URL 参数
        const queryObject = querystring.parse(parsedUrl.query);
        const chineseParam = queryObject.chineseParam;

        // 对中文参数进行 URL 编码
        const encodedChineseParam = encodeURIComponent(chineseParam);

        // 创建一个新的 URL
        const newUrl = `/article?chineseParam=${encodedChineseParam}`;

        // 发送重定向响应
        res.writeHead(302, { 'Location': newUrl });
        res.end();
    } else {
        // 其他请求处理逻辑
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.end('Hello World\n');
    }
}).listen(3000, () => {
    console.log('Server is running at http://localhost:3000/');
});

解释

  1. 引入模块:我们引入了 httpurl 模块,以及 querystring 模块来处理 URL 查询字符串。
  2. 解析 URL:通过 url.parse() 方法解析客户端请求的 URL。
  3. 检查路径:如果请求的路径是 /redirect,则执行重定向逻辑。
  4. 处理查询参数:使用 querystring.parse() 方法解析查询字符串,并提取其中的参数。
  5. URL 编码:使用 encodeURIComponent() 方法对含有中文的参数进行编码。
  6. 创建新 URL:根据编码后的参数创建新的重定向 URL。
  7. 发送重定向响应:设置响应头中的 Location 字段为新的 URL,并发送 302 状态码的响应,表示临时重定向。
  8. 其他请求处理:对于非重定向请求,发送简单的欢迎消息。

通过这种方式,你可以确保 URL 中的中文字符被正确编码,避免因特殊字符导致的重定向错误。


encodeURIComponent(url)

谢谢,还真的行了,大神能加你qq交流不

在 Node.js 中进行 URL 重定向时,如果 URL 包含中文字符,可能会遇到编码问题导致报错。这是因为 URL 中的非 ASCII 字符需要进行适当的编码才能正确传输。

解决方法是使用 encodeURIComponent 对包含中文的字符串进行编码,然后再进行重定向。当客户端收到重定向请求后,浏览器会自动解码 URL。

示例代码

const express = require('express');
const app = express();

app.get('/redirect', (req, res) => {
    const chineseText = '中文测试';
    // 对包含中文的字符串进行编码
    const encodedUrl = encodeURIComponent(`/article/${chineseText}`);
    res.redirect(`http://example.com/page?redirectUrl=${encodedUrl}`);
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  • encodeURIComponent 函数会对 URL 中的特殊字符进行编码,使得 URL 在传输过程中不会出错。
  • 当客户端(浏览器)接收到重定向后的 URL 后,会自动将 URL 中编码的字符还原为原始字符。

通过这种方式可以避免因 URL 编码问题而导致的重定向错误。

回到顶部