我需要在运行时设置package.json
中的proxy
值,就像使用环境变量一样。这是怎么做到的呢?
// package.json
{
"name": "demo",
"proxy": process.env.MY_PROXY_VAL , // <- how?
"dependencies": {},
"scripts": {},
}
谢谢。
它会自动从HTTPS_PROXY
或HTTP_PROXY
读取,所以你不需要这样做。
From the docs:
用于传出https请求的代理。如果设置了HTTPS_PROXY或HTTPS_PROXY或HTTP_PROXY或HTTP_PROXY环境变量,则底层请求库将遵循代理设置。
所以我把我的评论变成一个答案,因为我认为指出这个问题的实际解决方案是很重要的。
我正在寻找完全相同的答案,并尝试通过.env文件设置HTTP_PROXY
和HTTPS_PROXY
变量,也直接从脚本内。然而,这并不能解决问题,因为这将覆盖本地机器的系统代理设置,我不认为OP打算这样做。结果可能是你无法再加载npm包,因为不正确的系统代理设置。
/src
文件夹下创建一个本地setupProxy.js
文件,该文件将覆盖package.json
中的代理集。当然,你必须确保所有的路径都是正确设置的,但它工作得很好,你可以细粒度地控制应用程序中的哪些页面将被代理,哪些不会。
针对您关于如何通过环境变量设置代理的问题,这里有一个示例,您可以使用setupProxy
方法和createProxyMiddleware
:
// Sample of how to setup a proxy middleware with environment variables
//// file: <project_root>/src/setupProxy.js
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function(app) {
app.use(
'/rest',
createProxyMiddleware({
target: process.env.REACT_APP_PROXY_HOST,
changeOrigin: true,
})
);
};
//// file: <project_root>/.env
REACT_APP_PROXY_HOST=https://localhost:6700
在本例中,我只想代理针对/rest
端点的请求,为此我创建了一个新端点。所有其他请求仍然会转到默认的localhost:3000
Url,为react应用提供服务。
主机通过环境变量REACT_APP_PROXY_HOST
定义。我在本地.env
文件中定义了这个变量,但如果需要,您也可以在package.json
的脚本中直接设置它。
:尽管最初的问题已经为我解决了,但我有一个额外的问题,试图将请求转发到运行在https
上的服务器。以前的开发设置对于package.json
中的静态代理集已经很好了。但是,当使用createProxyMiddleware
并以使用证书运行在https上的服务器为目标时,必须提供所使用证书的路径。
// Sample of how to setup a proxy middleware with environment variables
// targeting a server running on https
//// file: <project_root>/src/setupProxy.js
const { createProxyMiddleware } = require('http-proxy-middleware');
const fs = require('fs');
const protocol = JSON.parse(process.env.HTTPS) ? "https:" : "http:";
const host = process.env.REACT_APP_PROXY_HOST
const port = process.env.REACT_APP_PROXY_PORT
module.exports = function(app) {
app.use(
'/rest',
createProxyMiddleware({
target: {
protocol: protocol,
host: host,
port: port,
pfx: fs.readFileSync('src/root-cert.pem')
},
changeOrigin: true,
})
);
};
//// file: <project_root>/.env
HTTPS=true
REACT_APP_PROXY_HOST=localhost
REACT_APP_PROXY_PORT=6700
在这种情况下,不应将目标作为字符串提供,而应将其作为包含protocol
, host
, port
和属性pfx
的对象给出,其中包含通过https验证服务器的证书。在本例中,它是项目源目录中的硬编码路径,但是也可以使用环境变量设置它。
设置HTTPS=true
覆盖默认的开发设置,并且默认情况下将在https://localhost:3000
启动开发服务器。通过此设置以及提供正确的证书,可以访问运行在https上的服务器,而不会出现问题。
作为参考,此解决方案在http-proxy-middleware
和底层node-http-proxy
的文档中有正式链接:
- https://github.com/chimurai/http-proxy-middleware/blob/master/recipes/https.md
- https://github.com/http-party/node-http-proxy http——https-using-a-pkcs12-client-certificate
这个问题在其他地方也得到了一些关注,例如
- https://github.com/facebook/create-react-app/issues/3783
- https://github.com/facebook/create-react-app/issues/4288
- https://github.com/usc-isi-i2/kgtk-browser/issues/32
希望帮助寻找同样问题的人,如果有任何更新或事情变化,请随时在评论中添加建议。