创建后更新任务详细信息导致错误 - Microsoft Planner API

时间:2018-01-09 16:15:21

标签: node.js api microsoft-graph

我一直在使用Microsoft Graph planner API将以前创建的计划程序(有点像模板)推送到新创建的计划程序(该功能正在运行但我无法等待它转过来谁知道当),

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

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

然而请求"获取任务细节"创建它后立即导致404错误

  

{      错误:{         代码:"",         消息:"找不到请求的项目。",         innerError:{            " request-id":" ...",            日期:" ..."         }      }   }

我最初跳过了"获取任务细节"但这常常导致412"如果找不到匹配错误"

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

目前,尝试"获取任务详细信息"几分钟之后完美无缺。

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

任何想法都将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

通过流程,我将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仅用于记录日志,您可以删除它和日志。