簡體   English   中英

SetTimeout Function:發送到客戶端后無法設置標頭

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM