【问题标题】:Updating Task detail after create causes error - Microsoft Planner API创建后更新任务详细信息会导致错误 - Microsoft Planner API
【发布时间】:2019-04-02 03:48:11
【问题描述】:

我一直在使用 Microsoft Graph 规划器 API 将先前创建的规划器(有点像模板)推送到新创建的规划器(该功能正在开发中,但我迫不及待地等待它在谁知道何时滚动) ,

所以我创建了简单的 Web 应用程序 (Nodejs),它只是将模板推送到新的规划器上。

目前的流量是 计划员创建 -> 存储桶创建 -> 任务创建 -> 获取任务详细信息(以确保任务存在)-> 更新任务详细信息(复选框)。

但是在创建后立即请求“获取任务详细信息”会导致 404 错误

{ 错误: { 代码: ””, message: "未找到请求的项目。", 内部错误:{ “请求ID”:“...”, 日期: ”...” } } }

我最初跳过了“获取任务详细信息”,但这经常导致 412“如果找不到匹配错误”

Web 应用程序正在运行(实际上几个月没有推送任何更改)。

目前,几分钟后尝试“获取任务详细信息”效果很好。

我只能假设现在创建导致此错误的任务需要更长的时间,但我不能让用户闲置几分钟来完成此操作。

任何想法将不胜感激。

谢谢。

【问题讨论】:

    标签: node.js api microsoft-graph-api


    【解决方案1】:

    操作执行是异步的,有时操作可能需要一些时间才能完成。您需要阅读任务详细信息才能对其进行更新,因为 PATCH 操作需要使用 If-Match 标头传入客户端的最后一个已知 etag。管道中有一些不同的改进来改善服务端的这种情况,这应该会自动提高可靠性。

    您提到您的方案是从模板计划创建一个新计划,这应该需要创建许多任务。根据您的描述,我假设您创建了一个任务,然后在继续下一个任务之前更新该任务的详细信息。如果您更改顺序以便在更新其任何详细信息之前创建所有任务,则该服务将有更多时间完成异步操作,然后再进行详细更新。您仍然需要重试读取以确定。

    我知道这不是一个真正的解决方案,但这种方法应该让用户体验更好一些,直到服务行为得到改善。

    【讨论】:

    • 感谢您的建议!不幸的是,在更新之前先创建所有任务仍然导致找不到任务错误我只是决定在后端创建计划进程以在几分钟后处理它。并警告用户填充计划器需要一段时间。
    【解决方案2】:

    问题在于,当您发送创建新任务的初始请求时,从未创建任务详细信息实例,这是一个异步过程。

    随着流程,我添加了 delay 步骤 5 秒。

    使用 Graph API,我添加了一个循环来继续尝试,直到我得到光荣的 200 OK

    getDetails(taskID:string) : Observable<MicrosoftGraph.PlannerTaskDetails> {
    
        let u = 'planner/tasks/' + taskID + '/details';
    
        let s = new Subject<MicrosoftGraph.PlannerTaskDetails>();
    
        let stamp = function stamp(){
            let d = new Date();
            return '[ss:ms][' + d.getSeconds() + '-' +  d.getMilliseconds() + ']';
        }
    
        let askDetails = () => {
            let detailsAjaxObs = this.getData<MicrosoftGraph.PlannerTaskDetails>(u, null, true);
            detailsAjaxObs.delay(650).subscribe(
                details => {
                    console.log('getDetails => getData <PlannerTaskDetails> , s.next(details) ' + stamp());
                    s.next(details);
                },
                err => {
                    console.info('getDetails => getData <PlannerTaskDetails> err, trying again | ' + stamp());
                    console.info(err);
                    askDetails();
                    //s.error(err);
                    //error "kill" the objs just like complete
                }
            );
        };
    
        askDetails();
    
        return s.asObservable();
    } // end getDetails
    

    我想今天我会将delay 更改为仅 5000,在这个应用程序中,我希望尽快获得结果,并且不关心不需要的请求。另外stamp 仅用于日志记录,您可以将其和日志删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多