快递中出现意外"write after end"错误



我试图代理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',它通常会通过并执行该请求,然后通过管道返回。但是现在我开始收到:

错误:write after end

你的管道不对。就像现在一样,你要管道到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);
});

最新更新