Node.js Multer无法通过FormData保存上载的文件

Node.js Multer无法通过FormData保存上载的文件,node.js,vue.js,express,multer,Node.js,Vue.js,Express,Multer,我无法将通过VueJS前端发送的上传文件保存到Node+Express后端。数据通过多部分表单数据从前端发送,因此所有元数据和文件本身都附加在请求主体中。以下是后端上的路由器 import {submitFlag} from '../some/dir/controller.js' const router = express.Router(); const app = express(); app.use(express.json()); router.post('/submit-flag

我无法将通过VueJS前端发送的上传文件保存到Node+Express后端。数据通过多部分表单数据从前端发送,因此所有元数据和文件本身都附加在请求主体中。以下是后端上的路由器

import {submitFlag} from '../some/dir/controller.js'

const router = express.Router();
const app = express();
app.use(express.json());


router.post('/submit-flag', [], submitFlag)
以及处理来自路由器的API请求的后端控制器

import multer from 'multer';
const evidencePathSave = '../uploads/flagEvidence'

export const submitFlag = async (req, res) => {
    const evidenceStorage = multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, evidencePathSave)
        },
        filename: function (req, file, cb) {
            cb(null, req.body.flagEvidence.name);
        }
    })
    const uploadEvidence = multer({
        storage: evidenceStorage,
        fileFilter: (req, res, cb) => {
            const filetypes = /pdf|doc|docx|txt/;
            const mimetype = filetypes.test(req.body.flagEvidence.type);
            const extname = filetypes.test(path.extname(req.body.flagEvidence.name));
            // if mimetype && extname are true, then no error
            if(mimetype && extname){
                return cb(null, true);
            }
            // if mimetype or extname false, give an error of compatibilty
            return cb("The uploaded file, isn't compatible");
        }
    }).fields([
        {name: 'flagEvidence', maxCount: 1}
    ]);
    uploadEvidence(req, res, function(err) {
        if (err) {
            console.log(err)
            res.status(500).send("Error in Saving");
        }
    })
    res.status(200)
}
该函数不返回任何错误或状态500消息,但在检查本地存储时,似乎在任何地方都找不到该文件。删除文件过滤器功能似乎不起作用

前端Vue功能如下所示

submitFlag(event) {
    this.flagEvidence = event.target.files[0]
    var formData = new FormData()
    formData.append('flagSubject', this.flagSubject)
    formData.append('flagWriteup', this.flagWriteup)
    formData.append('flagEvidence', this.flagEvidence)
    formData.append('userID', this.user._id)
    formData.append('username', this.user.username)
    formData.append('publicationID', this.publicationID)
    formData.append('filename', this.flagEvidence.name)
    axios({
        method: "POST",
        url: serverSide.submitFlag,
        data: formData,
        headers: {"Content-type": "multipart/form-data"}
    })
    .then((res) => {
      this.$router.push({name: "news", query:{id: this.publicationID}})
    })
    .catch(function (error) {
        console.error(error.response);
    });
}

你对multer的使用不正确
multer.fields()
返回应作为中间件传递到路由的函数。以下是您的案例中的情况:

const-evidenceStorage=multer.diskStorage({
目标:函数(req,文件,cb){…},
文件名:函数(请求、文件、cb){
cb(null,file.originalname);
},
});
const uploadEvidence=multer({
存储:证据存储,
fileFilter:(请求、res、cb)=>{…},
);
转发器(
“/submit标志”,
uploadEvidence.fields([{name:'flagEvidence',maxCount:1}]),
提交标签
);
另外,在配置
DiskStorage
时,我会使用
file.originalname
而不是
req.body.flagEvidence.name
。在Node.js中使用文件上载时,请查看此免费版本