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

Node.js中间件如何合并冗余代码 抽离公共upload中间件逻辑

解决方法

你可以把重复的upload调用逻辑封装成公共函数,根据两个中间件的回调逻辑是否一致,有两种抽离方案:

方案1:两个upload回调逻辑完全一致

直接抽离公共中间件函数复用即可:

// 抽离公共的upload执行逻辑
const handleUpload = (req, res, next) => {
  upload(req, res, (err) => {
    // 公共业务逻辑
  })
  next()
}

// 两个中间件直接复用公共逻辑
exports.useMulterS3 = handleUpload
exports.useMulter = handleUpload

方案2:两个upload回调逻辑有差异

封装成工厂函数,把各自的自定义逻辑作为参数传入即可:

// 封装工厂函数,接收自定义处理回调作为参数
const createUploadMiddleware = (customCallback) => {
  return (req, res, next) => {
    upload(req, res, (err) => {
      // 先执行公共逻辑
      // 再执行传入的自定义回调
      customCallback(err)
    })
    next()
  }
}

// 分别生成对应中间件,传入各自的业务逻辑
exports.useMulterS3 = createUploadMiddleware((err) => {
  // useMulterS3 专属的处理逻辑
})
exports.useMulter = createUploadMiddleware((err) => {
  // useMulter 专属的处理逻辑
})

注意事项

你当前的写法是在upload调用后直接执行next(),会出现upload还没处理完就进入下一个中间件的问题,如果你后续逻辑依赖上传结果,建议把next()放到upload的回调内部执行:

const createUploadMiddleware = (customCallback) => {
  return (req, res, next) => {
    upload(req, res, (err) => {
      if (err) {
        customCallback(err)
        return next(err)
      }
      customCallback()
      // 上传处理完成后再进入下一个中间件
      next()
    })
  }
}

内容的提问来源于stack exchange,提问作者hellorc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:27:04