You need to enable JavaScript to run this app. 如何在Node.js中解码前端经base64编码的JSON对象字符串
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js中解码前端经base64编码的JSON对象字符串

问题根因

你遇到的报错核心有两点:

  1. request.body 不是预期的base64编码字符串,而是已经被Node.js服务端的JSON解析中间件(如express的express.json())自动解析为了对象,直接传入Buffer.from()触发类型错误
  2. 原有解码逻辑缺少将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 04:06:03