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
相关产品推荐
相关产品推荐

