基于AJV的Firebase中间件测试失败问题求助
Firebase HTTPS函数AJV验证中间件Jest测试崩溃问题
问题简述
开发用于Firebase HTTPS函数的AJV数据验证中间件,需求如下:
- 校验传入数据,合法则调用
next继续执行 - 数据非法或Schema加载失败时抛出
*HttpsError*
测试场景:加载有效Schema但传入无效数据时,终端能看到AJV的ValidationError,但Jest测试直接崩溃,报错Jest worker encountered 4 child process exceptions, exceeding retry limit。给validate(data)添加try/catch后问题依旧。
测试代码
it("should fail with an error when submitting invalid data", () => { const middleware = createValidationMiddleware("customer.schema.json"); expect(() => middleware({})).toThrow(HttpsError); });
验证脚本(TypeScript)
export const createValidationMiddleware: (schema: Schemas) => Middleware = (schema) => (data, context, next) => { const validate = ajv.getSchema(schema); if (!validate) throw new HttpsError( "failed-precondition", `schema ${schema} does not exist` ); if (!validate(data)) throw new HttpsError( "invalid-argument", `The data is invalid: ${validate.errors}` ); return next(data, context); };
错误信息
终端AJV验证错误
ValidationError: validation failed
Jest测试报错
FAIL src/middlewares/validation.test.ts ● Test suite failed to run Jest worker encountered 4 child process exceptions, exceeding retry limit at ChildProcessWorker.initialize (node_modules/jest-worker/build/workers/ChildProcessWorker.js:170:21)
解决方案
修复错误信息序列化问题
validate.errors是AJV的错误对象数组,直接拼接进字符串会导致无法序列化的循环引用,Jest worker进程处理时崩溃。改成JSON序列化错误信息:if (!validate(data)) throw new HttpsError( "invalid-argument", `The data is invalid: ${JSON.stringify(validate.errors)}` );补全测试参数
当前测试调用middleware({})时未传入context和next参数,执行到return next(data, context)时会抛出next is not a function的错误,这是worker崩溃的核心原因之一。修改测试代码,传入mock的next函数:it("should fail with an error when submitting invalid data", () => { const mockNext = jest.fn(); const middleware = createValidationMiddleware("customer.schema.json"); expect(() => middleware({}, {}, mockNext)).toThrow(HttpsError); });确保HttpsError导入正确
确认测试文件中正确导入Firebase的HttpsError,避免因模块导入错误导致的异常:// 根据Firebase版本选择导入路径 import { HttpsError } from "firebase-functions/v2/https"; // 或v1版本:import { HttpsError } from "firebase-functions";临时禁用Jest多进程(排查用)
如果以上方法无效,在jest.config.js中设置单进程测试,排查是否是多进程环境下AJV Schema加载的问题:module.exports = { // 其他配置项 maxWorkers: 1 };
内容的提问来源于stack exchange,提问作者Thomas Kuhlmann
相关产品推荐
相关产品推荐

