读取SNS Topic文件遇JSON解析错误:TS2339类型异常排查
解决读取SNS Topic文件时的TS2339错误及JSON解析问题
问题分析
你遇到的TS2339: Property 'Records' does not exist on type 'string'错误,根源有两个:
readFile读取返回的data是字符串类型,直接访问data.Records不符合TypeScript的类型规则,字符串不存在该属性。- 存储SNS Topic的文件内容格式不合法,仅包含
"Records": [...]结构,缺少外层包裹的大括号,无法直接通过JSON.parse解析为有效JSON对象。
修复方案
1. 修正文件格式(推荐)
将文件内容补全为标准JSON结构,给"Records": [...]添加外层大括号:
{ "Records": [...] }
2. 调整代码逻辑
场景1:已修正文件格式
先将读取到的字符串解析为JSON对象,再逐层访问目标属性:
import { readFile } from "fs"; readFile("./regex", "utf-8", (err, data) => { if (err) { console.error(err); return; } // 先解析字符串为JSON对象 const snsData = JSON.parse(data); // 若Sns.Message是JSON字符串,需二次解析;若为普通文本则去掉JSON.parse const messageText = JSON.parse(snsData.Records[0].Sns.Message); console.log(messageText); });
场景2:无法修改文件格式
如果不能调整文件内容,可在代码中手动补全JSON格式后再解析:
import { readFile } from "fs"; readFile("./regex", "utf-8", (err, data) => { if (err) { console.error(err); return; } // 给不完整的内容包裹大括号,转为合法JSON字符串 const validJsonStr = `{ ${data} }`; const snsData = JSON.parse(validJsonStr); const messageText = JSON.parse(snsData.Records[0].Sns.Message); console.log(messageText); });
额外优化(TypeScript类型约束)
为避免后续类型报错,可给解析后的对象定义类型:
interface SnsMessageInfo { // 根据实际Message结构定义属性 } interface SnsRecord { Sns: { Message: string; }; } interface SnsData { Records: SnsRecord[]; } // 解析时指定类型 const snsData = JSON.parse(data) as SnsData; const messageText = JSON.parse(snsData.Records[0].Sns.Message) as SnsMessageInfo;
内容的提问来源于stack exchange,提问作者Shaun Turner
相关产品推荐
相关产品推荐

