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

ApolloServer不遵循faker-js种子值问题求助

解决Apollo Server Mock每次查询结果重复的问题

问题根源

你的mock逻辑存在两个核心问题:一是全局的faker(或casual)种子在服务器启动后固定不变,Apollo Server不会自动为每次查询重置随机生成器;二是mock函数里的faker.name.fullName未调用方法(缺少()),实际返回的是函数引用而非具体名称值。

有效解决方案

方案1:每次生成Mock时创建独立Faker实例

不再复用全局faker实例,而是在每个mock解析函数内部创建新实例并设置动态种子(比如结合时间戳+随机数),确保每次查询生成全新数据:

import { faker } from "@faker-js/faker";

export const mocks = {
  Person: () => {
    // 每次生成Person时初始化新的faker实例
    const dynamicFaker = faker.create();
    dynamicFaker.seed(Date.now() + Math.random());
    return {
      name: dynamicFaker.name.fullName() // 调用方法生成具体名称
    };
  },
  People: () => {
    const dynamicFaker = faker.create();
    dynamicFaker.seed(Date.now() + Math.random());
    const personCount = dynamicFaker.datatype.number({ min: 1, max: 5 });
    return {
      person: [...Array(personCount)].map(() => ({}))
      // 返回空对象后,Apollo会自动调用Person的mock填充数据
    };
  }
};

方案2:使用mockResolvers编写动态解析逻辑

在mockEntireSchema: false的前提下,直接为指定字段编写动态mock解析函数,确保每次查询都执行随机生成逻辑:

const server = new ApolloServer({
  typeDefs,
  mocks: false, // 关闭自动全局mock
  mockResolvers: {
    Person: {
      name: () => {
        faker.seed(Date.now() + Math.random());
        return faker.name.fullName();
      }
    },
    Query: {
      people: () => {
        faker.seed(Date.now() + Math.random());
        const count = faker.datatype.number({ min: 1, max: 5 });
        return {
          person: Array(count).fill(null).map(() => ({}))
        };
      }
    }
  },
  mockEntireSchema: false
});

方案3:通过Apollo插件在查询前重置种子

利用Apollo Server插件,在每次查询执行前重置faker种子,保证后续mock调用使用全新种子:

const resetFakerSeedPlugin = {
  async requestDidStart() {
    return {
      async executionDidStart() {
        // 用时间戳+随机数生成唯一种子
        faker.seed(Date.now() + Math.random());
      }
    };
  }
};

const server = new ApolloServer({
  ...,
  mocks: {
    Person: () => ({
      name: faker.name.fullName() // 务必调用方法生成值
    }),
    People: () => {
      const count = faker.datatype.number({ min: 1, max: 5 });
      return { person: [...Array(count)].map(() => ({})) };
    }
  },
  mockEntireSchema: false,
  plugins: [resetFakerSeedPlugin]
});

关键注意事项

  • 所有faker的方法调用必须加(),比如faker.name.fullName(),否则返回的是函数引用而非实际数据。
  • 避免依赖全局faker实例的固定种子,每次查询或生成mock时都要重置种子或创建新实例,从根源避免数据重复。

内容的提问来源于stack exchange,提问作者elias-berg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:05:18