[英]SetTimeout Function: Can't set headers after they are sent to the client
此代碼應編寫一個文件,在生成進程中運行它,然后在超時時終止生成進程。 但是,只要它觸發超時,我就會收到 [ERR_HTTP_HEADERS_SENT] 錯誤。
$.get('/path', function(req, res){
// data = contents of a file
fs.writeFile(filename, data, (err) => {
const child_process = spawn(//run file, {detached: true});
const wait = setTimeout(function() {
try {
process.kill(-runner.pid);
return res.send("Timeout Message");
}
}, 3000);
runner.on('exit', (code, signal) => {
clearTimeout(wait);
fs.unlink(filename, (err) => {
if (code === 0) return res.send("Good");
else return res.send('Fail');
});
});
runner.stdout.on('data', function(data) {
console.log('stdout: ' + data);
});
runner.stderr.on('data', function(data) {
console.log('stderr: ' + data);
});
runner.on('error', (err) => {
clearTimeout(wait);
fs.unlink(filename, (error) => {
return res.send("Error");
});
});
});
}
感謝您的幫助!
您將兩次結束請求。 這就是您獲得ERR_HTTP_HEADERS_SENT
的原因。
您的代碼的問題是當達到超時時,正在調用.on('exit')
並且您再次響應,此時clearTimeout
不會執行任何操作,因為超時已經發生。
解決方案是在每個res.send
之前添加res.headersSent
檢查
runner.on('exit', (code, signal) => {
clearTimeout(wait);
fs.unlink(filename, (err) => {
if (code === 0) return !res.headersSent && res.send("Good");
else return !res.headersSent && res.send('Fail');
});
});
或者檢查是否發生超時並在exit
事件中響應而不是timeout
回調。 或者只是使用特定信號終止進程,並在kill
事件時測試該信號。
const wait = setTimeout(function() {
runner.kill('SIGKILL'); // Use whatever signal you prefer
}, 3000);
runner.on('exit', (code, signal) => {
clearTimeout(wait);
if(signal === 'SIGKILL')
return res.send("Timeout Message");
else if (code === 0)
return res.send("Good");
else return res.send('Fail');
fs.unlink(filename, (err) => {});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.