使用Jest测试Formidable时出现TypeError错误求助
问题描述
我编写了一个自定义Express中间件用于解析传入的multipart表单,该中间件在本地运行或部署后均正常工作,但使用Jest进行测试时出现如下错误:
TypeError: Cannot set property domain of [object process] which has only a getter
问题源于Formidable所依赖的asap包,报错代码行是raw.js文件中的:
domain.active = process.domain = null;
目前无法迁移到Formidable V3,求可行的解决办法或替代方案?
可行解决办法
1. 给process.domain添加可写setter
在Jest测试文件的最顶部添加这段代码,覆盖process.domain的默认配置:
Object.defineProperty(process, 'domain', { get: () => process._domain, set: (value) => { process._domain = value; }, configurable: true });
这样就能让asap包中的赋值操作正常执行,不会触发只读属性的错误。
2. Mock asap包绕过报错逻辑
直接用Jest的mock功能替换asap的实现,避免修改process对象的代码:
jest.mock('asap', () => (callback) => { // 用原生Promise队列替代asap的逻辑 Promise.resolve().then(callback); });
这个mock保留了asap的异步执行特性,但跳过了导致报错的process.domain赋值步骤。
3. 临时回退Jest版本
部分较新的Jest版本对process对象的属性做了更严格的只读限制,回退到v27.x版本(或更早)可能暂时解决问题,但这只是临时方案,不建议长期依赖。
4. 替换为其他multipart解析中间件
如果上述方法都不适用,可以考虑更换中间件:
- multer:Express生态中最常用的multipart解析库,社区成熟,Jest测试兼容性好
- busboy:轻量级底层解析器,可高度自定义,测试时更容易控制
内容的提问来源于stack exchange,提问作者Sethlans
相关产品推荐
相关产品推荐

