SPFx获取列表项附件报错及动态ID调用失败问题求助
解决SPFx Web Part中动态获取列表项附件的TypeError问题
问题原因
当使用动态ID(如Number(r[i]["ID"]))调用getById时,传入的ID可能未正确转换为整数类型,导致SPFx的REST API客户端无法正确初始化列表项对象,进而引发attachmentFiles is not a function错误。而固定数字ID(如51)是明确的整数类型,所以能正常工作。
修复方案
方案1:确保ID为整数类型
将动态ID转换为整数时,使用parseInt并指定基数10,避免潜在的类型转换问题:
const r = await sp.web.lists.getByTitle("MyList").getItemsByCAMLQuery({ ViewXml: this.properties.camlQuery, }); for (var i = 0; i < r.length; i++) { const itemId = parseInt(r[i]["ID"], 10); // 明确转换为整数 console.log('ID:' + itemId); const item: IItem = sp.web.lists.getByTitle(this.properties.listName).items.getById(itemId); console.log('got by id'); const attachmentInfo: IAttachmentInfo[] = await item.attachmentFiles(); console.log('got attachmentInfo'); // 处理附件逻辑 attachmentInfo.map(file => { var fileType = file.FileName.split('.').pop(); var fileUrl = file.ServerRelativeUrl; console.log('fileType:' + fileType); console.log('fileUrl:' + fileUrl); }) }
方案2:一次性获取列表项及附件(更高效)
通过CAML查询时直接expand附件字段,避免循环调用attachmentFiles(),提升性能同时规避类型问题:
// 查询时直接展开AttachmentFiles const r = await sp.web.lists.getByTitle("MyList").getItemsByCAMLQuery({ ViewXml: this.properties.camlQuery, }, "$expand=AttachmentFiles"); for (var i = 0; i < r.length; i++) { console.log('ID:' + r[i]["ID"]); // 直接从返回结果中获取附件 const attachmentInfo: IAttachmentInfo[] = r[i]["AttachmentFiles"]; console.log('got attachmentInfo'); // 处理附件逻辑 attachmentInfo.map(file => { var fileType = file.FileName.split('.').pop(); var fileUrl = file.ServerRelativeUrl; console.log('fileType:' + fileType); console.log('fileUrl:' + fileUrl); }) }
额外检查点
- 确认列表项的ID字段键名是否正确:部分场景下SP返回的ID字段可能是
Id(驼峰首字母大写),可通过console.log(r[i])查看完整字段结构。 - 确保
this.properties.listName与列表标题完全匹配,避免因名称错误导致的对象初始化失败。
内容的提问来源于stack exchange,提问作者Pete Whelan
相关产品推荐
相关产品推荐

