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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:19:23