Skip to content

MSW mock handler bypasses protocol, causes filter/sort/top to fail in console – should proxy to protocol service #858

@hotlong

Description

@hotlong

Bug Summary

在 console(MSW 模式)中通过 GET /api/v1/data/contact?... 访问时,filter/sort/top 等查询参数全部失效,返回所有数据,server 模式下行为正常。

复现方式

  1. 启动 dev server (pnpm dev)。
  2. 访问 /api/v1/data/contact?top=100&sort=name&filter=["priority","=","medium"]
  3. 发现过滤条件没有生效,返回所有数据。
  4. 同样接口在 pnpm dev:server 下过滤正常。

问题分析

  • apps/console/src/mocks/handlers.ts 的 Data handler 直接调用 driver.find,不经过 ObjectStack 协议 protocol 层,相当于绕过 query 解析和 filter/sort/top 的标准化。
  • Metadata handlers 是调用 protocol 服务的,所以 server/MSW 是一致的。
  • Data handlers 需要像 Metadata 一样调用 protocol 服务,不能直接 driver。
  • filter/sort/top 等参数解析/标准化只能在协议层统一做,否则容易分叉。

最佳解决方案

  • MSW 模式下 Data handler 应直接 proxy 转发到 protocol 服务(如同 Metadata handler)。这样 MSW 路径和 server 路径完全一致,filter/sort/top/query/pagination 所有解析/支持都自动同步。
  • handler 不应处理任何业务参数,只做 HTTP ↔ protocol 的适配,不做 query params 到 driver.find 的手动映射。

问题代码片段

http.get(`${prefix}${baseUrl}/data/:objectName`, async ({ params, request }) => {
  const url = new URL(request.url);
  const query: any = {};

  url.searchParams.forEach((value, key) => {
    try {
      query[key] = JSON.parse(value);
    } catch {
      query[key] = value;
    }
  });

  const response = await driver.find(params.objectName as string, query);
  return HttpResponse.json({ value: response }, { status: 200 });
}),

建议修复

  • 改为:
// 直接转发给 protocol data 服务,不做 query 解析
const response = await protocol.getData({ object: params.objectName, query: url.search });
  • 或者统一处理:参考 Metadata handler 的实现,把所有 data CRUD 都走 protocol。

影响分析

  • 目前所有通过 MSW dev 的 Data CRUD 均未经过协议栈,filter/sort/top 都失效,实际测试 server/dev 下表现完全不同。
  • 长期维护风险:业务协议变更容易遗漏 MSW handler。

开发任务完成之后都应该运行test,并且相关的问题,然后更新roadmap。

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions