为何express-validator的对象属性发生变更?数组使用场景问题
问题:数组中复用验证对象导致属性变更
我定义了包含validationChain类型属性的验证对象,并将该对象同时用于两个数组中。发现原本没有.NotEmpty规则的'Title'属性,在第一个数组使用后,第二个数组里的对应属性也新增了.NotEmpty规则,想知道原因。
原因与解决办法
核心原因
- 对象引用传递特性:JavaScript中对象属于引用类型,将同一个验证对象放入两个数组时,数组中的元素并非独立副本,而是指向内存中同一个对象的引用。
- 链式验证方法的副作用:像express-validator这类库的
ValidationChain链式方法(如.NotEmpty()),调用时会直接修改原实例的内部配置(链式调用返回的是原对象而非新实例)。因此第一个数组中对验证对象的修改,会同步影响所有指向该对象的引用。
代码示例复现
// 模拟你的验证对象 const baseValidator = { Title: body('title') // 初始无.NotEmpty规则 }; // 两个数组引用同一个对象 const arr1 = [baseValidator]; const arr2 = [baseValidator]; // 在arr1中添加验证规则 arr1[0].Title = arr1[0].Title.NotEmpty(); // arr2中的Title也会带有.NotEmpty规则,因为指向同一个对象 console.log(arr2[0].Title); // 已包含NotEmpty规则
解决办法
- 创建独立实例:每次使用时通过工厂函数生成新的验证对象,确保每个数组中的对象相互独立:
const createValidator = () => ({ Title: body('title') }); const arr1 = [createValidator()]; const arr2 = [createValidator()]; // 修改arr1的规则不会影响arr2 arr1[0].Title = arr1[0].Title.NotEmpty(); - 复制验证链实例:如果使用express-validator,可调用
.clone()方法复制ValidationChain,避免修改原对象:const baseValidator = { Title: body('title') }; const arr1 = [{ Title: baseValidator.Title.clone().NotEmpty() }]; const arr2 = [baseValidator]; // arr2不受arr1修改影响
内容的提问来源于stack exchange,提问作者Tuấn Hiệp
相关产品推荐
相关产品推荐

