Clerk认证迁移脚本出现422错误:表单数据缺失求助
Clerk用户迁移422表单数据缺失问题排查与解决
我在使用Clerk迁移脚本测试虚拟用户导入时,持续触发422错误,提示表单数据缺失。已反复检查users.json和index.ts代码,仍无法定位问题。以下是相关信息,求解决方案:
迁移日志错误信息
{ "userId": "89", "status": 422, "clerkTraceId": "41cfcb7bd30342c6ed60c4efe65a5a6b", "clerkError": true, "errors": [ { "code": "form_data_missing", "message": "missing data", "meta": {} } ], "originalLine": 155, "originalColumn": 12 }
users.json单用户示例
[ { "externalId": "89", "email": "user89@example.com", "firstName": "User89", "lastName": "Lastname89", "password": "$2a$12$9HhLqMJxqBKhlZasxjlhger67GFcC4aOAtpcU.THpcSLiQve4mq6.", "passwordHasher": "bcrypt" } ]
index.ts核心代码
// ...(省略无关导入与配置代码) const createUser = (userData: User) => userData.password ? clerkClient.users.createUser({ externalId: userData.externalId, emailAddress: [userData.email], firstName: userData.firstName, lastName: userData.lastName, password: userData.password }) : clerkClient.users.createUser({ externalId: userData.externalId, emailAddress: [userData.email], firstName: userData.firstName, lastName: userData.lastName, skipPasswordRequirement: true, }); // ...(省略后续处理代码)
问题根源与解决方案
问题出在createUser函数的参数传递上:当导入带有哈希密码的用户时,Clerk API要求必须同时提供password和passwordHasher字段,否则会判定为表单数据缺失。你的代码中仅传入了password,遗漏了passwordHasher参数。
修复后的createUser函数
const createUser = (userData: User) => userData.password ? clerkClient.users.createUser({ externalId: userData.externalId, emailAddress: [userData.email], firstName: userData.firstName, lastName: userData.lastName, password: userData.password, passwordHasher: userData.passwordHasher // 新增该行 }) : clerkClient.users.createUser({ externalId: userData.externalId, emailAddress: [userData.email], firstName: userData.firstName, lastName: userData.lastName, skipPasswordRequirement: true, });
额外优化建议
为避免因passwordHasher为空导致的错误,可在Zod schema中添加约束:当存在password时,passwordHasher为必填项:
const userSchema = z.object({ externalId: z.string(), email: z.string().email(), firstName: z.string().optional(), lastName: z.string().optional(), password: z.string().optional(), passwordHasher: z .enum([ "argon2i", "argon2id", "bcrypt", "md5", "pbkdf2_sha256", "pbkdf2_sha256_django", "pbkdf2_sha1", "scrypt_firebase", ]) .optional() .refine((val, ctx) => { // 当有password时,必须提供passwordHasher const parent = ctx.parent as { password?: string }; if (parent.password && !val) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: "passwordHasher is required when password is provided", }); return false; } return true; }), });
修复后重新测试单个用户,即可解决422表单数据缺失的问题。
内容的提问来源于stack exchange,提问作者Ryan Uyeki
相关产品推荐
相关产品推荐

