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

PnP JS v3读取SharePoint文档库文件URL字段异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:30:54