Nuxt:使用NuxtJS服务器中间件修改来自代理服务器的响应

时间:2019-11-18 14:45:42

标签: http server proxy middleware nuxt

我正在使用NuxtJS server middleware作为代理通行证,如this article中所述 将传入的请求代理到内部服务,以避免跨域问题。

const httpProxy = require('http-proxy')
const proxy = httpProxy.createProxyServer()
const API_URL = 'https://api.mydomain.com'

export default function(req, res, next) {
  proxy.web(req, res, {
    target: API_URL
  })
}

如何分析代理服务器的响应并可能在此级别对其进行修改?

1 个答案:

答案 0 :(得分:0)

我在http-proxy documentation中找到了一个示例。 要修改响应,必须将 selfHandleResponse 设置为true。 这是文档中的示例:

var option = {
  target: target,
  selfHandleResponse : true
};
proxy.on('proxyRes', function (proxyRes, req, res) {
    var body = [];
    proxyRes.on('data', function (chunk) {
        body.push(chunk);
    });
    proxyRes.on('end', function () {
        body = Buffer.concat(body).toString();
        console.log("res from proxied server:", body);
        res.end("my response to cli");
    });
});
proxy.web(req, res, option);

如果请求与某个网址匹配,下面的代码可以让我处理代理答案,否则直接转发(管道)。

proxy.once('proxyRes', function(proxyRes, req, res) {
  if (!req.originalUrl.includes('api/endpoint')) {
    res.writeHead(proxyRes.statusCode) // had to reset header, otherwise always replied proxied answer with HTTP 200
    proxyRes.pipe(res)
  } else {
    // modify response
    let body = []
    proxyRes.on('data', function(chunk) {
      body.push(chunk)
    })
    proxyRes.on('end', function() {
      body = Buffer.concat(body).toString()
      console.log('res from proxied server:', body)
      res.end('my response to cli')
    })
  }
})

请注意,我添加了将.on()替换为once()的功能。