这个简单的node.js代理为何以及如何工作?

时间:2018-07-12 23:28:55

标签: node.js proxy cors

我在Netlify上有一个仅限前端的Web应用程序,该应用程序必须使用OpenSubtitles.org上的API。尽管OpenSubtitles.org启用了CORS,但有时我遇到了预检错误,因此我决定使用代理。

我在使用Netlify的代理功能时遇到了问题,因此我决定在Heroku上创建自己的代理,并将我的请求从前端发送到那里,以便将这些请求从服务器代理到OpenSubtitles.org。

我根据发现的here代码得出了以下结论:

const express = require('express');
const request = require('request');

express()
    .use('/', function(req, res) {
        req.pipe(
            request({
                url: 'http://rest.opensubtitles.org/search' + req.url,
                headers: {
                    'User-Agent': 'TemporaryUserAgent'
                }
            })
        ).pipe(res);
    })
    .listen(process.env.PORT || 8000);

我认为我可以部署它,然后尝试一下,然后在那之后启用CORS。但是,我刚刚意识到它无需任何其他操作即可完美运行。这怎么可能?为什么我可以在不显式启用CORS的情况下,通过其他域上的仅前端应用程序调用它?

此外,如果服务器崩溃了,该如何处理那里的错误?

1 个答案:

答案 0 :(得分:1)

CORS之所以有效,是因为您请求的url响应的标头Access-Control-Allow-Origin设置为*。由于您正在将该响应及其标头传递回原始res对象,因此它将启用CORS,就像它来自您的本地代理一样。

下面是一个更直接的示例,说明如何将请求代理到另一个站点并使用节点流完整返回其响应。

const express = require('express')
const request = require('request')
const port = process.env.PORT || 1337

let server = express()

const proxyMiddleware = (req, res, next) => {
  let url = `https://www.google.com/${req.url}`
  let proxyRequest = request(url)

  // Pass request to proxied request url
  req.pipe(proxyRequest)

  // Respond to the original request with the response from proxyRequest
  proxyRequest.pipe(res)
}

server.use(proxyMiddleware)

server.listen(port, () => console.log(`Listening on ${port}`))
相关问题