使用formidable时报Can't set headers after they are sent错误,求解决

使用formidable解析上传文件时报Can't set headers after they are sent错误

router.post('/admin-push-post-featureImg', function(req, res) {
    var form = new formidable.IncomingForm();
    form.uploadDir = __dirname + '/../tmp';
    form.maxFieldsSize = 2000 * 1024;
    form.on('progress', function(bytesReceived, bytesExpected) {
        if(bytesReceived > form.maxFieldsSize) {
            resMessageIndex = 6;
            // res.status(413);
            this.emit('error');
        }
    })
    .on('fileBegin', function(name, file) {
        if(file.type != "image/png" && file.type != "image/jpeg" && file.type != "image/gif") {
            resMessageIndex = 7;
            // res.status(415);
            this.emit('error');
        }
    })
    .on('file', function(name, file) {
        var extName = "";
        switch(file.type) {
            case "image/png": extName = "png"; break;
            case "image/gif": extName = "gif"; break;
            default: extName = "jpg";
        }
        var alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTOVWXYZ"; 
        var strLength = 10; 
        var strUnique = '';
        for(var i = 0; i < strLength; i++){
            strUnique += alphabet.charAt(Math.floor(Math.random() * alphabet.length));
        }
        var date = new Date();
        var dateDirectory = date.getFullYear() + "-" + ("0" + (date.getMonth() + 1)).slice(-2);
        var dateDay = ("0" + date.getDate()).slice(-2);
        var imgPath = __dirname + "/../public/images/charImg";
        if(!fs.existsSync(imgPath + "/" + dateDirectory)) {
            fs.mkdirSync(imgPath + "/" + dateDirectory);
        }
        if(!fs.existsSync(imgPath + "/" + dateDirectory + "/" + dateDay)) {
            fs.mkdirSync(imgPath + "/" + dateDirectory + "/" + dateDay);
        }
        fs.renameSync(file.path, imgPath + "/" + dateDirectory + "/" + dateDay  
            + "/" + strUnique + date.getTime() + "." + extName);
        var tmps = "/images/charImg" + "/" + dateDirectory + "/" + dateDay  + "/" 
            + strUnique + date.getTime() + "." + extName;
        return res.send({errCode: 0, errMsg: '', data: tmps});
    })
    .on('error', function(err) {
        return res.send({errCode: 500, errMsg: resMessage[resMessageIndex]});
        // try{
        //     res.header('Connection', 'close');
        //     return res.send(resMessage[resMessageIndex]);
        // }catch(e){
        //     console.log(e);
        // }
    });
    form.parse(req);
});

图片描述

阅读 2.2k
1 个回答

lz应该是在form.on("end")时才进行最终的结果处理并res.send吧?file时候,仅仅是传递完每一个文件时候。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题