我在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的情况下,通过其他域上的仅前端应用程序调用它?
此外,如果服务器崩溃了,该如何处理那里的错误?
答案 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}`))