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
相关产品推荐
相关产品推荐

