在使用 node.js 进行 http post 请求时,有时候会遇到中文参数传递后出现乱码的情况。本文将分享一些常见的解决方法。
原因分析
当我们在 Node.js 中通过 HTTP POST 请求提交中文参数时,如果不进行编码处理,那么中文参数会以 UTF-8 编码发送到服务器端。但是有些情况下,服务器端无法正确解析 UTF-8 编码的中文参数,导致出现乱码。这种情况通常有以下几种原因:
- 服务器端未正确设置编码格式。如果服务器端未正确设置编码格式为 UTF-8,则无法正确解析从客户端发送过来的 UTF-8 编码的中文参数,导致乱码。
- 客户端未正确设置请求头。当我们通过 Node.js 进行 HTTP POST 请求时,需要设置请求头中的 Content-Type 字段为 application/x-www-form-urlencoded;charset=utf-8,以告诉服务器端接收的请求参数为 UTF-8 编码。
- Node.js 模块未正确处理编码。在 Node.js 中,有些模块并未默认设置编码格式为 UTF-8,需要我们手动指定。如果在使用这些模块时未进行编码处理,则会出现乱码问题。
解决方法
方法一:设置服务器端编码格式为 UTF-8
我们可以在服务器端设置编码格式为 UTF-8,以正确解析从客户端发送过来的 UTF-8 编码的中文参数。在 Express 框架中,我们可以通过以下代码设置编码格式为 UTF-8:
const express = require('express')
const app = express()
app.use(express.urlencoded({ extended: false }))
app.use(express.json())
app.use(function(req, res, next) {
res.header('Content-Type', 'text/html; charset=utf-8')
next()
})方法二:设置请求头为 UTF-8
我们可以在 Node.js 中设置请求头中的 Content-Type 字段为 application/x-www-form-urlencoded;charset=utf-8,以告诉服务器端接收的请求参数为 UTF-8 编码。在使用 axios 库进行 HTTP POST 请求时,我们可以这样设置请求头:
const axios = require('axios')
axios.post('/api/posts', {
title: '中文标题',
content: '中文内容'
}, {
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
}
}).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})方法三:手动进行编码处理
对于一些未设置默认编码为 UTF-8 的 Node.js 模块,我们可以手动进行编码处理,将中文参数转换为 UTF-8 编码。在使用 querystring 模块进行编码处理时,我们可以这样使用:
const querystring = require('querystring')
const https = require('https')
const postData = querystring.stringify({
title: '中文标题',
content: '中文内容'
})
const options = {
hostname: 'www.example.com',
path: '/api/posts',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData)
}
}
const req = https.request(options, res => {
console.log(`statusCode: ${res.statusCode}`)
res.on('data', d => {
process.stdout.write(d)
})
})
req.on('error', error => {
console.error(error)
})
req.write(postData)
req.end()总结
在进行 Node.js HTTP POST 请求时,中文参数出现乱码的情况是比较常见的。我们需要正确设置服务器端编码格式、请求头和手动进行编码处理,以保证能够正确传递中文参数。同时,在使用一些 Node.js 模块时,我们还需注意其是否已经默认设置编码格式为 UTF-8。










