angular前后端分离代理后端服务器

参考资料

背景

步骤

  1. 在项目的根目录下创建一个 proxy.conf.json 文件,紧挨着 package.json。
  2. 往这个新的代理配置文件中添加如下内容:
{
  "/api": {
    "target": "http://localhost:9999",
    "secure": false
  }
}
  1. 在 CLI 配置文件 angular.json 中为 serve 目标添加 proxyConfig 选项:
"architect": {
  "serve": {
    "builder": "@angular-devkit/build-angular:dev-server",
    "options": {
      "browserTarget": "your-application-name:build",
      "proxyConfig": "./proxy.conf.json"
    },

我的配置

  1. 要使用这个代理选项启动开发服务器,请运行 ng serve 命令

其它

重写 URL 路径

pathRewrite 代理配置项能让你在运行时重写 URL 路径。 比如,你可以在代理配置中指定如下的 pathRewrite 值,以移除路径末尾的 “api” 部分。

content_copy

"/api": {
    "target": "http://localhost:3000",
    "secure": false,
    "pathRewrite": {
      "^/api": ""
    }
  }}
如果你要访问的后端不在 localhost 上,还要设置 changeOrigin 选项。比如:
{
  "/api": {
    "target": "http://npmjs.org",
    "secure": false,
    "pathRewrite": {
      "^/api": ""
    },
    "changeOrigin": true
  }}
要想了解你的代理是否在如预期般工作,可以设置 logLevel 选项。比如:
{
  "/api": {
    "target": "http://localhost:3000",
    "secure": false,
    "pathRewrite": {
      "^/api": ""
    },
    "logLevel": "debug"
  }}
代理的有效日志级别是 info(默认值)、debug、warn、error 和 silent。

代理多个条目

通过用 JavaScript 定义此配置,你还可以把多个条目代理到同一个目标。

将代理配置文件设置为 proxy.conf.js(代替 proxy.conf.json),并指定如下例子中的配置文件。

const PROXY_CONFIG = [
    {
        context: [
            "/my",
            "/many",
            "/endpoints",
            "/i",
            "/need",
            "/to",
            "/proxy"
        ],
        target: "http://localhost:3000",
        secure: false
    }]

module.exports = PROXY_CONFIG;

在 CLI 配置文件 angular.json 中,指向 JavaScript 配置文件:
content_copy
...
"architect": {
  "serve": {
    "builder": "@angular-devkit/build-angular:dev-server",
    "options": {
      "browserTarget": "your-application-name:build",
      "proxyConfig": "src/proxy.conf.js"
    },

绕过代理

如果你需要根据情况绕过此代理,或在发出请求前先动态修改一下,可以添加 bypass 选项,就像下例的 JavaScript 所示。
const PROXY_CONFIG = {
    "/api/proxy": {
        "target": "http://localhost:3000",
        "secure": false,
        "bypass": function (req, res, proxyOptions) {
            if (req.headers.accept.indexOf("html") !== -1) {
                console.log("Skipping proxy for browser request.");
                return "/index.html";
            }
            req.headers["X-Custom-Header"] = "yes";
        }
    }
}

module.exports = PROXY_CONFIG;

npm install --save-dev https-proxy-agent
请在 JavaScript 配置文件中使用如下内容。
var HttpsProxyAgent = require(https-proxy-agent);
var proxyConfig = [{
  context: /api,
  target: http://your-remote-server.com:3000,
  secure: false
}];
 
function setupForCorporateProxy(proxyConfig) {
  var proxyServer = process.env.http_proxy || process.env.HTTP_PROXY;
  if (proxyServer) {
    var agent = new HttpsProxyAgent(proxyServer);
    console.log(Using corporate proxy server:  + proxyServer);
    proxyConfig.forEach(function(entry) {
      entry.agent = agent;
    });
  }
  return proxyConfig;
}
 
module.exports = setupForCorporateProxy(proxyConfig);
经验分享 程序员 微信小程序 职场和发展