You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过proxy.conf.json直接向Angular应用返回JSON数据?

用Angular代理直接返回Mock JSON(无需后端)

嘿,这个问题我刚好碰到过!纯JSON格式的proxy.conf.json确实没法直接返回自定义JSON,因为它的核心定位就是请求转发工具。不过我们可以换用JavaScript版的代理配置文件来实现这个需求,操作起来也挺简单的~

具体实现步骤

1. 创建JavaScript代理配置文件

把原来的proxy.conf.json重命名为proxy.conf.js(或者直接在src目录下新建这个文件),然后写入自定义的拦截逻辑。这里我们用bypass函数来拦截指定接口,直接返回Mock数据:

// 定义需要Mock的接口和对应JSON数据
const mockData = {
  '/api/user': {
    id: 1,
    name: 'Mock User',
    email: 'mock@example.com',
    roles: ['admin', 'user']
  },
  '/api/dashboard/stats': {
    totalUsers: 1200,
    activeToday: 340,
    revenue: 4567.89
  }
};

module.exports = {
  '/api': {
    // 这里随便填一个目标地址就行,因为我们会拦截请求跳过转发
    target: 'http://localhost:3000',
    changeOrigin: true,
    bypass: function(req, res, proxyOptions) {
      // 检查当前请求路径是否在Mock列表中
      if (mockData[req.path]) {
        // 设置响应头为JSON类型
        res.setHeader('Content-Type', 'application/json');
        // 返回预定义的Mock JSON数据
        res.end(JSON.stringify(mockData[req.path]));
        // 返回true表示跳过代理转发流程
        return true;
      }
      // 如果不在Mock列表里,继续走原代理转发逻辑(可选,适合部分接口Mock、部分转发的场景)
      return false;
    }
  }
};

2. 修改Angular配置文件

打开angular.json,找到serve选项下的proxyConfig,把路径改成我们刚创建的proxy.conf.js

"projects": {
  "your-app-name": {
    "architect": {
      "serve": {
        "builder": "@angular-devkit/build-angular:dev-server",
        "options": {
          "browserTarget": "your-app-name:build",
          "proxyConfig": "src/proxy.conf.js" // 改成JS文件路径
        },
        ...
      }
    }
  }
}

3. 启动Angular服务

重启你的Angular开发服务(ng serve),现在访问/api/user或者/api/dashboard/stats时,就会直接返回我们定义的Mock JSON,完全不需要启动后端服务啦!

进阶优化:拆分Mock数据文件

如果Mock数据比较多,直接写在proxy.conf.js里会显得杂乱。可以把每个接口的Mock数据单独放在JSON文件中,比如在src下创建mocks文件夹:

  • src/mocks/user.json
{
  "id": 1,
  "name": "Mock User",
  "email": "mock@example.com",
  "roles": ["admin", "user"]
}
  • src/mocks/dashboard-stats.json
{
  "totalUsers": 1200,
  "activeToday": 340,
  "revenue": 4567.89
}

然后在proxy.conf.js中导入这些文件:

const userMock = require('./src/mocks/user.json');
const dashboardStatsMock = require('./src/mocks/dashboard-stats.json');

const mockData = {
  '/api/user': userMock,
  '/api/dashboard/stats': dashboardStatsMock
};

module.exports = {
  '/api': {
    target: 'http://localhost:3000',
    changeOrigin: true,
    bypass: function(req, res, proxyOptions) {
      if (mockData[req.path]) {
        res.setHeader('Content-Type', 'application/json');
        res.end(JSON.stringify(mockData[req.path]));
        return true;
      }
      return false;
    }
  }
};

这样管理Mock数据会更清晰,也方便后续修改。

内容的提问来源于stack exchange,提问作者CodyBugstein

火山引擎 最新活动