快递中意外的“写完后”错误

时间:2016-08-22 13:15:21

标签: javascript node.js api express

我正在尝试通过我的服务器代理来自客户端的api调用以获得某些第三方服务,原因是CORS问题并在服务器端添加了密钥。我通常以下列方式完成它:

app.use('/someService', (req, res) => {
  let url = `https://example.com/${config.SECRET_KEY}/endpoint${req.url}`
  req.pipe(request(url).pipe(res))
})

这样我可以在客户端使用任何ajax库并执行get请求,例如:get: '/someService/params',它通常会通过并执行该请求然后将其重新管道。但是现在我开始得到:

  

错误:写完后

在快递中我并不完全确定可能导致它的原因。

1 个答案:

答案 0 :(得分:1)

你的管道是错误的。就像现在一样,你正在向res发送两次(.pipe()返回为了可链接性而传递给它的参数)。

而是试试这个:

req.pipe(request(url)).pipe(res)

我应该指出,正确代理HTTP响应并不是那么简单,因为无论中间请求的远程服务器响应什么,当前该行总是以HTTP状态代码200响应。此外,该回复中的所有标头都不会发送到res。考虑到这一点,你可以天真地尝试类似的东西:

var proxiedRes = req.pipe(request(url));
proxiedRes.on('response', function(pres) {
  res.writeHead(pres.statusCode, pres.headers);
  // You will want to add a `pres` 'error' event handler too in case
  // something goes wrong while reading the proxied response ...
  pres.pipe(res);
});