Node.js 错误\u HTTP\u头\u重定向请求时生成发送错误

Node.js 错误\u HTTP\u头\u重定向请求时生成发送错误,node.js,rest,http,express,api-design,Node.js,Rest,Http,Express,Api Design,我正在使用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('/companyr

我正在使用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()方法以便发送请求的头。查看错误堆栈跟踪时,似乎错误发生在我调用“data”事件回调中的res.send()方法时。也许我不了解请求之间的执行流程或事件的发出顺序。任何指导/信息都将不胜感激。

您不应该在
数据
事件回调中发送响应,因为响应将在您接收第一块数据时发送。您应该做的是将
写入响应流,并在
结束
事件回调中发送响应:

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

好的,我想我现在明白了。我发现Express中的res对象“只是节点自身响应对象的增强版本”[link]。我使用res.send()是因为我不知道它有一个write方法。我注意到Express对象从节点自己的HTTP模块继承了大部分属性和方法。我不理解的一点是,请求和响应对象发出的事件序列如何决定何时将数据写入响应流。不管怎样,我把我的代码改成了你建议的,效果很好。谢谢