如何在Node.js中解码前端经base64编码的JSON对象字符串
问题根因
你遇到的报错核心有两点:
request.body不是预期的base64编码字符串,而是已经被Node.js服务端的JSON解析中间件(如express的express.json())自动解析为了对象,直接传入Buffer.from()触发类型错误- 原有解码逻辑缺少将Buffer转为UTF-8字符串的步骤,即使入参类型正确,直接把Buffer传入
JSON.parse()也会报错
可行解决方案
方案1:客户端发送逻辑不变,调整服务端解析配置
如果客户端直接将base64字符串作为完整请求体发送,需要先关闭当前接口的JSON解析中间件,改用text类型解析中间件,再调整解码逻辑:
var getRequestBody = function(request) { // 此时request.body为客户端传入的纯base64字符串 const encodedRequestBody = request.body; // 解码base64为Buffer后,转成UTF-8字符串再做JSON解析 const decodedRequestBodyString = Buffer.from(encodedRequestBody, "base64").toString('utf8'); const requestBodyObject = JSON.parse(decodedRequestBodyString); return requestBodyObject; }
方案2:服务端全局JSON解析不变,调整客户端传参结构
如果服务端全局开启了JSON解析不方便修改,调整客户端发送逻辑,将编码后的字符串放到指定字段中:
客户端发送示例
const payload = getEncryptedPayload(X); fetch('/your/api', { method: 'POST', headers: { 'Content-Type': 'application/json' }, // 把编码后的内容放到对象字段中传输 body: JSON.stringify({ encodedData: payload }) })
对应服务端解码逻辑
var getRequestBody = function(request) { // 从解析后的对象中取出base64字段 const encodedRequestBody = request.body.encodedData; const decodedRequestBodyString = Buffer.from(encodedRequestBody, "base64").toString('utf8'); const requestBodyObject = JSON.parse(decodedRequestBodyString); return requestBodyObject; }
兼容非ASCII字符优化(可选)
浏览器原生btoa()仅支持ASCII字符,若你的JSON包含中文、emoji等非ASCII字符,可修改客户端编码逻辑避免乱码:
var getEncryptedPayload = function(payload) { payload = JSON.stringify(payload) // 转义非ASCII字符后再编码 payload = window.btoa(unescape(encodeURIComponent(payload))) return payload; }
服务端解码逻辑无需调整即可正常解析。
内容的提问来源于stack exchange,提问作者Abinash Biswal
相关产品推荐
相关产品推荐

