{"record":{"id":"49a9665946f7c63e","repo":"mongodb/node-mongodb-native","slug":"option-pkfactory-must-be-an-object-with-a-createpk","errorCode":null,"errorMessage":"Option pkFactory must be an object with a createPk function, got ${value}","messagePattern":"Option pkFactory must be an object with a createPk function, got (.+?)","errorType":"exception","errorClass":"MongoParseError","httpStatus":null,"severity":"error","filePath":"src/connection_string.ts","lineNumber":958,"sourceCode":"    type: 'boolean'\n  },\n  name: {\n    target: 'driverInfo',\n    transform({ values: [value], options }) {\n      return { ...options.driverInfo, name: String(value) };\n    }\n  } as OptionDescriptor,\n  noDelay: {\n    default: true,\n    type: 'boolean'\n  },\n  pkFactory: {\n    default: DEFAULT_PK_FACTORY,\n    transform({ values: [value] }): PkFactory {\n      if (isRecord(value, ['createPk'] as const) && typeof value.createPk === 'function') {\n        return value as PkFactory;\n      }\n      throw new MongoParseError(\n        `Option pkFactory must be an object with a createPk function, got ${value}`\n      );\n    }\n  },\n  promoteBuffers: {\n    type: 'boolean'\n  },\n  promoteLongs: {\n    type: 'boolean'\n  },\n  promoteValues: {\n    type: 'boolean'\n  },\n  useBigInt64: {\n    type: 'boolean'\n  },\n  proxyHost: {\n    type: 'string'","sourceCodeStart":940,"sourceCodeEnd":976,"githubUrl":"https://github.com/mongodb/node-mongodb-native/blob/dce7939f86fb283e167ad709955abedb7bf23124/src/connection_string.ts#L940-L976","documentation":"`pkFactory` lets you override _id generation. The transform at src/connection_string.ts:954 requires the value to be a record containing a `createPk` member that is a function (validated by `isRecord(value, ['createPk']) && typeof value.createPk === 'function'`); otherwise MongoParseError is thrown at src/connection_string.ts:958. The default factory is DEFAULT_PK_FACTORY (ObjectID-based).","triggerScenarios":"Passing a bare function `pkFactory: () => uuid()`; passing a class constructor; passing `{ generate: fn }` (wrong key); passing `{ createPk: 'not a function' }`.","commonSituations":"Adapting examples from other drivers or ODMs that take a function directly; renaming the method without updating the option; providing a UUID v4 function but forgetting to wrap it.","solutions":["Wrap the generator: `pkFactory: { createPk: () => uuid() }`.","Ensure the returned value is a BSON-serializable type (e.g. UUID, ObjectId, string).","If you only want ObjectIds, omit pkFactory entirely to use the default."],"exampleFix":"// before\nnew MongoClient(uri, { pkFactory: () => crypto.randomUUID() });\n\n// after\nnew MongoClient(uri, { pkFactory: { createPk: () => crypto.randomUUID() } });","handlingStrategy":"type-guard","validationCode":"function isPkFactory(v: unknown): v is { createPk: () => unknown } {\n  return typeof v === 'object' && v !== null && typeof (v as any).createPk === 'function';\n}\nif (opts.pkFactory != null && !isPkFactory(opts.pkFactory)) {\n  throw new Error('pkFactory must be { createPk: function }');\n}","typeGuard":"function isPkFactory(v: unknown): v is { createPk: () => unknown } { return !!v && typeof v === 'object' && typeof (v as any).createPk === 'function'; }","tryCatchPattern":"try { client = new MongoClient(uri, opts); } catch (e) { if (e instanceof MongoParseError && /pkFactory/.test(e.message)) { opts.pkFactory = { createPk: (opts as any).pkFactory }; client = new MongoClient(uri, opts); } else throw e; }","preventionTips":["Always wrap generator functions in `{ createPk: fn }`.","Make the createPk return value BSON-serializable.","Omit pkFactory entirely if you want default ObjectId generation."],"tags":["object-id","configuration","type-error"],"backgroundTag":null,"analyzedSha":"dce7939f86fb283e167ad709955abedb7bf23124","analyzedAt":"2026-08-11T04:54:53.215Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}