首页 > 解决方案 > 安排一个 Axios POST 请求

问题描述

我有一个客户端定期发送 GET 请求以获取早前生成的需求状态。

如果需求已准备就绪,服务器将响应客户端请求的信息,并应在 X 分钟后安排 Axios POST 请求。

现在,我尝试过使用PromisessetTimeout但它们似乎不起作用。我想知道res.json我使用的是否引起了一些问题。

     api.get('/api-gitlab-launcher/request-status', async (gitlabRequest, res, next) => {
        requestNb = gitlabRequest.headers['request-nb']
        let obj = getRequestInfo(gitlabRequest, requestNb)
        if (obj.requestStatus === "Not found") {
            res.status(404)
            res.send("RequestNb doesn't exist!")
        } else if (obj.requestStatus === "Running") {
            res.status(400)
            res.send("Not finished yet")
        } else if (obj.requestStatus === "finished") {
            // This code will be scheduled to run after EXPIRATION_TIME
            setTimeout(async () => {
                let data = new FormData();
                data.append("token", DESTROY_TOKEN);
                data.append("ref", "terraform-v1");
                data.append("variables[LAST_PIPELINE_ID]", pipelineId);
                config = {
                    method: "POST",
                    url: `https://gitlab.com/api/v4/projects/${PROJECT_ID_DESTROY}/trigger/pipeline`,
                    data: data,
                    headers: {
                        ...data.getHeaders(),
                    },
                };
                console.log('About to launch POST request')
                await axios(config).then(
                    () => {
                        console.log("Resources destroyed.");
                    },
                    (error) => {
                        console.log(`error : ${error}`);
                    }
                );
            }, EXPIRATION_TIME);

            res.status(200);
            res.json({ec2Link: obj.ec2InstanceLink});
        }
    }
)

我做对了吗?做错什么了吗?我对所有批评持开放态度。

编辑:Axios POST 请求无需setTimeout()包装即可工作:

START RequestId: 03ee88f5-4abc-4f63-a59c-faa877c4b9f4 Version: $LATEST
END RequestId: 03ee88f5-4abc-4f63-a59c-faa877c4b9f4
REPORT RequestId: 03ee88f5-4abc-4f63-a59c-faa877c4b9f4  Duration: 1396.87 ms    Billed Duration: 1400 ms    Memory Size: 128 MB Max Memory Used: 91 MB  Init Duration: 585.65 ms    
START RequestId: 9ffcbec2-6445-422c-87b7-4a5164b0593b Version: $LATEST
END RequestId: 9ffcbec2-6445-422c-87b7-4a5164b0593b
REPORT RequestId: 9ffcbec2-6445-422c-87b7-4a5164b0593b  Duration: 5.03 ms   Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 91 MB  
START RequestId: 3577932d-53ec-4ee0-bf4a-f8aee12eba67 Version: $LATEST
END RequestId: 3577932d-53ec-4ee0-bf4a-f8aee12eba67
REPORT RequestId: 3577932d-53ec-4ee0-bf4a-f8aee12eba67  Duration: 1.60 ms   Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 91 MB  
START RequestId: ab854edb-5a86-41b1-81de-8bec85a54ad2 Version: $LATEST
END RequestId: ab854edb-5a86-41b1-81de-8bec85a54ad2
REPORT RequestId: ab854edb-5a86-41b1-81de-8bec85a54ad2  Duration: 210.82 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 92 MB  
START RequestId: 5f6ae638-ea84-4308-8ea5-6ae3d3fb0116 Version: $LATEST
END RequestId: 5f6ae638-ea84-4308-8ea5-6ae3d3fb0116
REPORT RequestId: 5f6ae638-ea84-4308-8ea5-6ae3d3fb0116  Duration: 516.74 ms Billed Duration: 600 ms Memory Size: 128 MB Max Memory Used: 93 MB  
START RequestId: ddeb01ae-c9f6-40b2-ace5-b8b47ed21ebe Version: $LATEST
2020-09-09T20:15:53.893Z    ddeb01ae-c9f6-40b2-ace5-b8b47ed21ebe    INFO    About to launch POST request
2020-09-09T20:15:54.644Z    ddeb01ae-c9f6-40b2-ace5-b8b47ed21ebe    INFO    Resources destroyed.
END RequestId: ddeb01ae-c9f6-40b2-ace5-b8b47ed21ebe
REPORT RequestId: ddeb01ae-c9f6-40b2-ace5-b8b47ed21ebe  Duration: 753.89 ms Billed Duration: 800 ms Memory Size: 128 MB Max Memory Used: 93 MB  

标签: node.jspromiseasync-awaitaxios

解决方案


else if按如下方式更改块,

else if (obj.requestStatus === "finished") {
    // This code will be scheduled to run after EXPIRATION_TIME
    setTimeout(async () => {
      let data = new FormData();
      data.append("token", DESTROY_TOKEN);
      data.append("ref", "terraform-v1");
      data.append("variables[LAST_PIPELINE_ID]", pipelineId);
      config = {
        method: "POST",
        url: `https://gitlab.com/api/v4/projects/${PROJECT_ID_DESTROY}/trigger/pipeline`,
        data: data,
        headers: {
          ...data.getHeaders(),
        },
      };
      await axios(config).then(
        () => {
          console.log("Resources destroyed.");
        },
        (error) => {
          console.log(`error : ${error}`);
        }
      );
    }, EXPIRATION_TIME);
  
    res.status(200);
    res.json({ ec2Link: obj.ec2InstanceLink });
  }
}

请注意,EXPIRATION_TIME以毫秒为单位。


推荐阅读