You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ssh2-sftp-client获取的Buffer转JSON报错如何解决?

问题解决方法

错误原因

SyntaxError: Unexpected token � in JSON at position 0 报错的核心原因是Buffer转换为字符串时存在非法字符,常见场景为两种:

  • 目标JSON文件开头带有不可见的UTF-8 BOM(字节顺序标记)
  • Buffer转字符串时未显式指定编码,默认编码和文件实际编码不匹配

修复方案

方案1:显式指定编码并过滤BOM头(推荐)

修改Buffer转字符串的逻辑,显式指定utf8编码,同时过滤可能存在的BOM头,补充连接关闭逻辑避免资源泄漏:

const Client = require('ssh2-sftp-client');

async function getFTPFile() {
  const sftp = new Client();
  const config = {
    host: ...,
    username: ...,
    password: ...
  };

  return sftp.connect(config)
    .then(() => sftp.get('./directory/Data.json'))
    .then((data) => {
      // 显式指定utf8编码,移除开头的UTF-8 BOM字符
      const jsonStr = data.toString('utf8').replace(/^\uFEFF/, '');
      return JSON.parse(jsonStr);
    })
    .finally(() => {
      // 用完主动关闭sftp连接
      sftp.end();
    });
}

方案2:直接通过get方法获取字符串

ssh2-sftp-client的get方法支持直接指定返回编码,无需手动处理Buffer:

return sftp.connect(config)
  // 第二个参数传null,第三个参数指定编码为utf8,直接返回字符串结果
  .then(() => sftp.get('./directory/Data.json', null, { encoding: 'utf8' }))
  .then((str) => {
    return JSON.parse(str.replace(/^\uFEFF/, ''));
  })
  .finally(() => sftp.end());

兜底排查方法

如果上述方案都无效,可以打印字符串前缀确认异常字符:

// 打印首个字符的十六进制编码,如果输出为feff则说明是BOM头
console.log(jsonStr.charCodeAt(0).toString(16));
// 打印前10个字符,确认是否存在其他非JSON语法的非法前缀
console.log(jsonStr.slice(0, 10));

如果确认存在其他非法字符,需要检查sFTP服务端的源文件是否为标准无冗余内容的UTF-8编码JSON文件。

内容的提问来源于stack exchange,提问作者John Bernal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:06:01