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
相关产品推荐
相关产品推荐

