我正在从我的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调用的超时时间,几个问题已经有了很好的答案,但是此方法不允许我超过两分钟的默认超时时间。