node.js - 这个简单的 node.js 代理为什么以及如何工作?
问题描述
我在 Netlify 上有一个仅限前端的 Web 应用程序,它必须使用 OpenSubtitles.org 上的 API。尽管 OpenSubtitles.org 启用了 CORS,但有时我会遇到预检错误,所以我决定使用代理。
我在使用 Netlify 的代理功能时遇到了问题,所以我决定在 Heroku 上创建自己的代理,并将我的请求从前端发送到那里,因此这些请求将从服务器代理到 OpenSubtitles.org。
我根据在这里找到的代码提出了以下内容:
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?
另外,如果服务器崩溃了,如何处理那里的错误?
解决方案
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}`))
推荐阅读
- python - 当我使用应用程序运行代码时,为什么会出现找不到页面 404 错误?没有应用程序也能正常工作
- python - 如何从 Python 中的二维数组中删除特定元素?
- python - 有没有办法在自动生成的 gui 中使用类成员的文档字符串?
- spring - 从 Spring Boot Filter 中的 Request 中获取 X-B3-TraceId
- android - 我们如何将 Android/iOS 应用程序连接到 Azure IoT Central 并发送遥测数据?
- mysql - 由于版本原因,mysql查询不起作用
- wpf - 使用 WPF Prism / Mahapps HamburgerMenu 控件时调用参数化视图模型构造函数
- cmake - 使用 Cmake 进行 Qt5 私有标头检测在 Fedora 上无法正常工作?
- django - 从用户模型中获取电子邮件
- mp3 - “MP3 文件格式无效。零持续时间。Seek 无法正常运行:”使用 HLS 流式传输大型 mp3 文件时出错