【问题标题】:Why and how this simple node.js proxy works?这个简单的 node.js 代理为什么以及如何工作?
【发布时间】:2018-12-21 06:48:06
【问题描述】:

我在 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 的情况下从不同域上的纯前端应用调用它?

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

【问题讨论】:

    标签: node.js proxy cors


    【解决方案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}`))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      相关资源
      最近更新 更多