关于封装formidable遇到的问题

来源:6-2 文件上传(上)

慕斯0315010

2019-12-24

用的是formidable,没有用koa-formidable,遇到了个问题,await next()没有继续派发路由。
Api路由

router.post('/upload',loginCheck,customFormmidable(),async (ctx,next) => {
  console.log(ctx.request.files)
  ctx.body = 123
})

封装的formidable

const formidable = require('formidable')
const  http = require('http')
const  util = require('util')
const  path = require('path')
const { ErrorModel } = require('../model/ResModel')
const { uploadFileFailInfo } = require('../model/errorInfo')
/**
 * formidable 封装
 * @method customFormmid
 * @param {Object} ctx koa2ctx 
 * @returns {Function}
 */
function customFormmidable(option) {
  console.log('ccc')
  async function fn(ctx,next) {
    // 初始化
    const form = new formidable.IncomingForm() 
    // 文件保存目录
    form.uploadDir = path.join(__dirname,'..','..','/upload')
    // 扩展
    form.keepExtensions = true
    // 文件大小
    form.maxFileSize = 200 * 1024 * 1024
    // 解析
    form.parse(ctx.req, async (err, fields, files) => {
      // 出错
      if(err) {
        return new ErrorModel(uploadFileFailInfo)
      }
      // 把数据挂载到ctx上
      ctx.request.files = util.inspect({fields: fields, files: files})
      await next()
    })
  }
  return fn
}

老师可以看一下,我的await next() 写的地方,我是写在一个异步函数里的,我试了把next拿到form.parse外面,路由就可以继续派发了,老师知道怎么回事吗?
我自己猜测应该是koa2的 dispatch机制的问题,查了资料也没找到问题。

写回答

1回答

双越

2019-12-25

这种问题,不要放在项目环境中,要单独、专门为 formidable 做一个 demo 。里面就有 koa2 和 formidable ,其余的什么都没有,运行看看能否成功?抛开其他工具和代码的影响,才能定位问题。

0
4
双越
回复
慕斯0315010
看着比较奇怪的问题,现在看来貌似不是 formidable 的问题。那你就再做一个 demo ,把 formidable 去掉,弄一个普通的中间件,里面写 await next() 看是否执行?(奇怪的问题,只能这么一点一点的调试,否则也看不出哪里的问题)
2019-12-25
共4条回复

Node.js+Koa2框架生态实战 - 从零模拟新浪微博

用 Koa2 做真正的实战项目,不再只是增删改查的小白工程师

965 学习 · 388 问题

查看课程