从服务器获取CORS响应,但仅用于两个api调用

时间:2019-01-05 11:36:37

标签: javascript ajax

问题摘要:

我陷入一个奇怪的问题,即我对同一API进行了两次调用,一次调用成功,而另一次返回504

  

在以下位置访问XMLHttpRequest   原产地的“ https://ocr.mywebsite.ai/tesseract/basic/”   “ http://localhost:8080”已被CORS政策禁止:否   请求中存在“ Access-Control-Allow-Origin”标头   资源。


详细问题

我有一个api,它以blob的形式接受图像,并以已解析的json进行响应。我有两个图像,因此我使用Promise.all()两次调用api,如下所示:

let ocrPromises = id_card_images.map((image, index) => {
                let header: IHeadersData = {};
                header = index === 0 ? {card_side: "front"} : {card_side: "back"};
                return this.parseImageUsingOCR(image, header)//makes http call and return promise
            });
let ocrData = await Promise.all(ocrPromises);

其中一个请求立即返回200响应,而另一个请求在5秒钟后失败,代码为504。任何人都可以提出这种行为的可能原因是什么?

继chrome网络面板之后。首先是失败的请求,其次是通过的请求。 failed Request passed Request


parseImageUsingOCR 方法进行实际的服务器调用(这是7号角代码)

parseImageUsingOCR(image, header: IHeadersData): Promise<{ parsed_data: any, s3_url: string }> {


        let blob = UtilityService.dataURItoBlob(image);
        let transliterationUrl = ConstantService.getTransliterationUrl();
        let formData: FormData = new FormData();
        formData.append('image', blob);
        let userData = StoreService.getUserData();
        let transliterationHeader: IHeadersData = UtilityService.getHeaderForOCRParseByCountryAndIdType(
            userData.country,
            userData.id_card_type
        );
        transliterationHeader = {
            ...transliterationHeader,
            img_type: 'id_card',
            ...header,
            // "content-type": "application/json"
        };

        return new Promise((resolve, reject) => {
            // alert(JSON.stringify(transliterationHeader));
            this.serverService.makePostRequest({url: transliterationUrl, body: formData, header: transliterationHeader})
                .subscribe((val: { parsed_data: IUser, raw_data: string, s3_url: string }) => {
                    if (val.parsed_data) {
                        resolve({
                            parsed_data: this.removeAllUndefinedFieldsFromObject(val.parsed_data),
                            s3_url: val.s3_url
                        })
                    } else {
                        resolve({parsed_data: {}, s3_url: val.s3_url});
                    }
                })
        })
    }

1 个答案:

答案 0 :(得分:1)

这实际上不是CORS问题。

获得200 OK响应的请求显示CORS标头存在。 失败的请求不会从任何服务器响应中得到答复,因此该服务器与您之间的网关将返回网关超时(HTTP 504)。

无论如何这都是一个问题,而且网关服务器未发送CORS标头的事实也不会产生太大的变化。我怀疑OCR服务器花费的时间太长,因此网关取消了请求,并以超时作为响应。

要么增加网关超时设置,要么尝试使用较小的图像,希望这些图像不会花费很长的OCR来处理。