如何增加http请求的默认超时时间?

时间:2019-07-26 08:19:14

标签: javascript node.js http

我正在从我的React应用程序向需要在某些物理硬件上运行命令的节点服务器进行呼叫。硬件大约需要三分钟才能完成其例程,但是只有两分钟后,请求在我的应用程序中总是超时。硬件通过串行连接,完成后将在命令行打印“ done”,因此我需要某种方式来查看何时在节点服务器中发生这种情况。

我曾尝试增加节点服务器上的setTimeout,但是据我了解,这只会影响它对其他服务器的请求,而不会影响对其的请求。我也尝试过产生一个子进程,而不是运行exec,但是我不确定如果范围限于初始调用函数,则如何在以后的api调用中访问它。

我的服务器中有一个函数run,如下所示:

function run(command) {
    return new Promise((resolve, reject) => {
        exec(command, (err, stdout, stderr) => {
            if(err){
                reject(stderr);
            }
            resolve(stdout);
        });
    });
}

我的api端点exec使用run就像这样:

app.post('/api/exec', (req, res) => {
    req.setTimeout(0); //some commands take a long time, so we shouldnt time out the response
    if(req.body.command){
        run(req.body.command)
            .then(data => {
                return res.status(201).send({
                    message: data
                });
            }).catch(err => {
                return res.status(500).send({
                    message: err
                });
            });
    } else {
        return res.status(400).send({
            message: "exec requires a command member"
        })
    }
});

最后,我使用以下命令从我的react应用程序中调用api:

execute = (c) => {
        fetch(`/api/exec`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
                command: c
            })
        }).then (resp => {
            ... do stuff with my app ...

我希望服务器将运行我的命令直到完成,然后通过运行命令以stdout响应,但是我的客户端应用程序在调用execute函数约两分钟后超时。

关于如何通过包装超时承诺来减少api调用的超时时间,几个问题已经有了很好的答案,但是此方法不允许我超过两分钟的默认超时时间。

0 个答案:

没有答案