ERR_HTTP_HEADERS_SENT Ошибка при перенаправлении запросов - PullRequest
0 голосов
/ 30 октября 2018

Я использую инфраструктуру Node.js и модуль Express для написания оболочки API, которая перенаправляет запросы на другой сервер. Я могу успешно перенаправить запрос на целевой сервер и получить действительный ответ, содержащий полезную нагрузку JSON. Однако после первоначального запроса, если я попробую другой запрос, я получаю следующую ошибку.

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

Это пример кода, который я написал для маршрута HTTP GET Express:

app.get('/companyrecords/:name', function(req, res) {

  const options = {
    protocol: 'http:',
    hostname: 'myhost',
    port: 5001,
    method: 'GET',
    path: '/path/to/resource/?name=name',
    auth: 'username:password',
    headers: {
      Connection: 'close'
    }
  }

  const myAppReq = http.request(options, (myAppRes) =>{
    console.log(`STATUS: ${myAppRes.statusCode}`);
    myAppRes.on('data', (chunk) => {
      console.log(`BODY: ${chunk}`);
      res.send(chunk);
    });
        myAppRes.on('end', () => {
        res.end('No more data to send.');
    });
  });

  myAppReq.on('error', (err) => {
    console.error(`Problem with request: ${err.message}`);
  });

  myAppReq.write('');
  myAppReq.end();
});

Не уверен, почему я получаю эту ошибку, так как я вызываю метод req.write () для отправки заголовков запроса. При взгляде на трассировку стека ошибок возникает ошибка, когда я вызываю метод res.send () внутри обратного вызова к событию data. Возможно, я не понимаю поток выполнения запроса или последовательность, в которой генерируются события. Любое руководство / информация будет принята с благодарностью.

1 Ответ

0 голосов
/ 31 октября 2018

Вы не должны отправлять ответ внутри data обратного вызова события, потому что ответ будет отправлен, когда вы получите первый кусок данных. Вам нужно записать chunk в поток ответов и отправить ответ внутри end обратного вызова события:

const myAppReq = http.request(options, (myAppRes) =>{
    myAppRes.on('data', (chunk) => {
      res.write(chunk);
    });
    myAppRes.on('end', () => {
      res.end();
    });
});
...