解决express-validation顺序处理中的no-await-in-loop及Promise.all问题
解决express-validator顺序验证与eslint no-await-in-loop冲突问题
原顺序验证代码因await在循环中触发eslint的no-await-in-loop规则错误,改用Promise.all后又会并行执行所有验证,无法在验证失败时终止后续流程。以下是两种可行解决方案:
方案一:在特定行禁用eslint规则
由于此处必须顺序执行验证,失败即停止,属于no-await-in-loop规则的合理例外场景,可直接在循环行添加eslint忽略注释,保留核心逻辑的同时调整为通过next传递结果:
const validate = (validations) => async (req, res, next) => { for (let validation of validations) { // eslint-disable-next-line no-await-in-loop const result = await validation.run(req); if (result.errors.length) break; } const errors = validationResult(req); if (errors.isEmpty()) { return next(); } // 将验证错误封装后传递给错误处理中间件 const validationError = new Error('Validation failed'); validationError.statusCode = 400; validationError.errors = errors.array(); next(validationError); };
方案二:用Promise.reduce实现顺序执行
若团队不允许禁用eslint规则,可通过reduce依次执行验证Promise,一旦验证失败则抛出错误终止后续流程:
const validate = (validations) => async (req, res, next) => { try { await validations.reduce(async (prevTask, validation) => { // 等待前一个验证完成 await prevTask; // 执行当前验证 const result = await validation.run(req); if (result.errors.length) { throw new Error('Validation failed'); } }, Promise.resolve()); // 所有验证通过,进入下一个中间件 next(); } catch (err) { // 收集所有验证错误并传递给错误处理中间件 const errors = validationResult(req); const validationError = new Error('Validation failed'); validationError.statusCode = 400; validationError.errors = errors.array(); next(validationError); } };
方案对比
- 方案一:代码简洁直观,只需添加一行注释即可解决规则冲突,适合快速迭代场景。
- 方案二:完全符合eslint规则要求,但代码逻辑稍复杂,适合对代码规范要求严格的团队。
内容的提问来源于stack exchange,提问作者vava044
相关产品推荐
相关产品推荐

