PnP JS v3读取SharePoint文档库文件URL字段异常
问题原因
PnP JS v3 默认对列表项查询做了返回字段过滤,仅靠CAML ViewFields声明字段不会生效,且文件相关的核心属性(文件名、各类URL)挂载在列表项关联的File对象上,未显式展开关联对象时不会随列表项返回。
可用方案
方案1:全量拉取列表项时配置展开与字段选择
调用getAll()方法时,链式调用expand挂载File关联对象,通过select显式声明需要返回的字段:
const allItems = await sp.web.lists.getByTitle(constants.visualsList).items .expand("File") .select( "Id", "Title", "FileRef", "EncodedAbsUrl", "FileLeafRef", "File/Name", "File/ServerRelativeUrl", "File/LinkingUrl" ) .getAll();
返回结果中可直接读取对应字段:
FileRef/File.ServerRelativeUrl:文件服务器相对路径,格式为/站点路径/文档库名/文件名.后缀EncodedAbsUrl:带域名的完整绝对访问路径FileLeafRef/File.Name:带后缀的原始文件名
方案2:CAML查询时配套配置字段规则
使用getItemsByCAMLQuery时,不能仅在ViewXml中声明FieldRef,必须同步在链式调用中配置expand和select,否则PnP的默认字段过滤规则会覆盖CAML的字段声明:
const queryItems = await sp.web.lists.getByTitle(constants.visualsList).items .expand("File") .select( "Title", "FileRef", "EncodedAbsUrl", "File/Name", "File/ServerRelativeUrl" ) .getItemsByCAMLQuery({ ViewXml: `<View> <ViewFields> <FieldRef Name='Title' /> <FieldRef Name='EncodedAbsUrl' /> <FieldRef Name='FileRef' /> <FieldRef Name='FileLeafRef' /> </ViewFields> <Query> <Where> <!-- 保留原有查询条件即可 --> </Where> </Query> </View>` });
方案3:直接读取文件集合(无需列表项元数据场景)
如果不需要读取列表项绑定的自定义字段,可直接访问文档库根文件夹下的文件集合,返回结果默认自带文件名、URL属性,无需额外展开配置:
const files = await sp.web.lists.getByTitle(constants.visualsList) .rootFolder .files .select("Name", "ServerRelativeUrl", "TimeCreated", "Length")();
注意事项
- 所有需要读取的文件属性必须显式写入
select配置,PnP JS v3不会默认返回未声明的字段 - 访问
File/开头的属性前必须调用.expand("File"),否则关联对象不会被加载,对应字段返回undefined - 如果需要读取图片缩略图地址,可在select中添加
File/ThumbnailUrl字段
内容的提问来源于stack exchange,提问作者punjabi
相关产品推荐
相关产品推荐

