更新文档库元数据 SPFx Web 部件时出现 InvalidClientQueryException

Posted

技术标签:

【中文标题】更新文档库元数据 SPFx Web 部件时出现 InvalidClientQueryException【英文标题】:InvalidClientQueryException when updating Document Library Metadata SPFx webpart 【发布时间】:2021-08-01 08:43:45 【问题描述】:

需要你的帮助! 我正在使用 REST API 将文档上传到 SPFx Webpart 中的文档库。我没有使用 PNP 和 React 进行文件上传和更新元数据。

上传文档后,我正在尝试通过获取 ID 并更新项目来更新元数据属性。

文件上传成功。能够获取添加的项目的 ID。在更新元数据属性时 - 它给了我 Microsoft.SharePoint.Client.InvalidClientQueryException","message":"lang":"en-US","value":"A type named 'SP.Data.模型无法解析 SubmitxyzfileListItem'。当模型可用时,每个类型名称都必须解析为有效类型。"

下面是我正在使用的代码

//Code for File Upload
 private uploadFile(FinalName:string): Promise<any>
 
      try       
          return new Promise((resolve) =>       
                  var files = (<htmlInputElement>document.getElementById('userFile')).files;
                  const spOpts: ISPHttpClientOptions =       
                      body: files[0]      
                  ;      
                  var url=`$this.context.pageContext.web.absoluteUrl$this.properties.primarylist/_api/Web/Lists/getByTitle('$this.properties.fileuploadlist')/RootFolder/Files/Add(url='$FinalName', overwrite=true)`
                  
                  const response = this.context.spHttpClient.post(url, SPHttpClient.configurations.v1, spOpts).then((response: SPHttpClientResponse) =>         
    
                        response.json().then(async (responseJSON: any) =>    
                        console.log("File Uploaded");       
                        var uniqueGuid = await responseJSON.UniqueId;   
                        this.updateDocLibMetadata(uniqueGuid);
                        console.log("uniqueGuid"+uniqueGuid); 
                        resolve(uniqueGuid);          
                      );        
                    );    
          );      
       catch (error)       
          console.log("Error in uploadFile " + error);      
      
  
\\Code for updating Document Library Metadata
  private updateDocLibMetadata(uniqueGuid:string) 

    var geturl=`$this.context.pageContext.web.absoluteUrl$this.properties.primarylist/_api/Web/Lists/getByTitle('$this.properties.fileuploadlist')/GetItemByUniqueId(guid'$uniqueGuid')?$select=id,name,UniqueId,Title,File/ServerRelativeUrl&$expand=File`;

    this.context.spHttpClient.get(geturl,SPHttpClient.configurations.v1)
    .then((response: SPHttpClientResponse) =>   
      response.json().then((responseJSON: any) =>   
        console.log("Id in updateDocLibMetadata :"+responseJSON["Id"]);
        var itemId=responseJSON["Id"];
        
        var posturl = this.context.pageContext.web.absoluteUrl +this.properties.primarylist+ `/_api/web/lists/GetByTitle('$this.properties.fileuploadlist')/items($itemId)`;
        var payload = JSON.stringify(
          "__metadata": 
            'type': this.getListItemType(this.properties.fileuploadlist)
          ,
          "Id_SubmitxyzQuestionId": this._requiredListProps.Id
        );
      
        var option = 
          headers: 
            'IF-MATCH': '*',
            'Content-type': 'application/json;odata=verbose',
            "accept": "application/json;odata=verbose",
            "odata-version":"3.0",
            'X-HTTP-Method': 'PATCH'
          ,
          body: payload
        ;
      
       //THIS FINAL CALL IS GIVING ERROR
       return this.context.spHttpClient.post(posturl, SPHttpClient.configurations.v1, option).then((UpdateResponse: SPHttpClientResponse) => 
          console.log(UpdateResponse.status + ':' + response.ok);
          UpdateResponse.text().then(function (text) 
            // do something with the text response 
            console.log("text:"+text);
          );
        )
        .catch(reject => console.error('Error :', reject));
      );  
    );
  

我确实看过 PowerAutomate 的一篇文章,其中说解决方案是检查文件然后更新属性。链接到 PowerAutomate 问题 - https://powerusers.microsoft.com/t5/Building-Flows/Update-list-item-via-SharePoint-REST-API/m-p/534538#M69186

对于 SPFx webart 也是 - 我必须使用相同的方法吗?

非常感谢任何帮助。

谢谢。

【问题讨论】:

【参考方案1】:

找到以上问题的答案! 更改了请求的有效负载和标头,并像魅力一样工作。

在查询中指定的 updateDocLibMetadata 方法中更改为以下代码。

 var payload = JSON.stringify(         
          "Id_SubmitxyzQuestionId": this._requiredListProps.Id
        );
      
        var option = 
          headers: 
            'Accept': 'application/json;odata=nometadata',  
            'Content-type': 'application/json;odata=nometadata',  
            'odata-version': '',  
            'IF-MATCH': '*',  
            'X-HTTP-Method': 'MERGE'  
          ,
          body: payload
        ;

【讨论】:

以上是关于更新文档库元数据 SPFx Web 部件时出现 InvalidClientQueryException的主要内容,如果未能解决你的问题,请参考以下文章

在现代站点中添加 SPFx webpart 时的 Javascript

在 SPFx Web 部件内显示库视图

SPFx Web 部件的 CSS 适用于它但不适用于页面的其余部分?

如何使用 SharePoint SPFX webpart 构建团队应用程序

SharePoint 2010:尝试使用电源外壳安装 Web 部件时出现问题

如何在单个 spfx 解决方案中创建两个 webpart?