Node.js 在multer上载文件之前获取除文件以外的其他字段的req.body

Node.js 在multer上载文件之前获取除文件以外的其他字段的req.body,node.js,multer,Node.js,Multer,我有一个使用multer上传文件的函数: exports.create = (req, res) => { console.log("req.body1 : ") console.log(req.body) var fileFilter = function (req, file, cb) { console.log("req.body2: ") console.log(req.body) // supported i

我有一个使用multer上传文件的函数:

exports.create = (req, res) => {
    console.log("req.body1 : ")
    console.log(req.body)
    var fileFilter = function (req, file, cb) {
        console.log("req.body2: ")
        console.log(req.body)
        // supported image file mimetypes
        var allowedMimes = ['image/jpeg', 'image/pjpeg', 'image/png', 'image/gif'];

        if (_.includes(allowedMimes, file.mimetype)) {
            // allow supported image files
            cb(null, true);
        } else {
            // throw error for invalid files
            cb(new Error('Invalid file type. Only jpg, png and gif image files are allowed.'));
        }
    };

    let upload = multer({
        storage: multer.diskStorage({
            destination: (req, file, callback) => {
                console.log("req.body3 : ")
                console.log(req.body)
                let userId = req.params.userId;
                let pathToSave = `./public/uploads/${userId}/store`;
                fs.mkdirsSync(pathToSave);
                callback(null, pathToSave);
            },
            filename: (req, file, callback) => {
                callback(null, uuidv1() + path.extname(file.originalname));
            }
        }),
        limits: {
            files: 5, // allow only 1 file per request
            fileSize: 5 * 1024 * 1024, // 5 MB (max file size)
        },
        fileFilter: fileFilter
    }).array('photo');

    upload(req, res, function (err) {
        console.log("req.body4 : ")
        console.log(req.body)
...
...
req.body : 
{}
req.body2: 
{}
req.body3 : 
{}
req.body4 : 
{ name: '1111111111',
  price: '1212',
  cid: '1',
...
正如您所看到的,有很多console.log通过POST方法打印出传入数据的信息。奇怪的是,文件以外的字段直到进入上次上传功能后才会出现

所以问题是,我无法使用这些字段验证内容,直到它到达最后一个上传函数。因此,如果文件以外的其他字段中存在任何错误,我无法取消和删除上传的文件

以下是上述代码的输出:

exports.create = (req, res) => {
    console.log("req.body1 : ")
    console.log(req.body)
    var fileFilter = function (req, file, cb) {
        console.log("req.body2: ")
        console.log(req.body)
        // supported image file mimetypes
        var allowedMimes = ['image/jpeg', 'image/pjpeg', 'image/png', 'image/gif'];

        if (_.includes(allowedMimes, file.mimetype)) {
            // allow supported image files
            cb(null, true);
        } else {
            // throw error for invalid files
            cb(new Error('Invalid file type. Only jpg, png and gif image files are allowed.'));
        }
    };

    let upload = multer({
        storage: multer.diskStorage({
            destination: (req, file, callback) => {
                console.log("req.body3 : ")
                console.log(req.body)
                let userId = req.params.userId;
                let pathToSave = `./public/uploads/${userId}/store`;
                fs.mkdirsSync(pathToSave);
                callback(null, pathToSave);
            },
            filename: (req, file, callback) => {
                callback(null, uuidv1() + path.extname(file.originalname));
            }
        }),
        limits: {
            files: 5, // allow only 1 file per request
            fileSize: 5 * 1024 * 1024, // 5 MB (max file size)
        },
        fileFilter: fileFilter
    }).array('photo');

    upload(req, res, function (err) {
        console.log("req.body4 : ")
        console.log(req.body)
...
...
req.body : 
{}
req.body2: 
{}
req.body3 : 
{}
req.body4 : 
{ name: '1111111111',
  price: '1212',
  cid: '1',
...
文件上传是通过console.log(“req.body3:”)完成的。然后它在console.log(“req.body4:”)中输出其他字段。我需要出现在req.body4中的其他字段在实际上载文件之前验证内容。但我不能,因为这些字段是在上传文件后检索的

在multer实际上传文件之前,如何获取其他人的字段

===============================================

追加:

exports.create = (req, res) => {
    console.log("req.body1 : ")
    console.log(req.body)
    var fileFilter = function (req, file, cb) {
        console.log("req.body2: ")
        console.log(req.body)
        // supported image file mimetypes
        var allowedMimes = ['image/jpeg', 'image/pjpeg', 'image/png', 'image/gif'];

        if (_.includes(allowedMimes, file.mimetype)) {
            // allow supported image files
            cb(null, true);
        } else {
            // throw error for invalid files
            cb(new Error('Invalid file type. Only jpg, png and gif image files are allowed.'));
        }
    };

    let upload = multer({
        storage: multer.diskStorage({
            destination: (req, file, callback) => {
                console.log("req.body3 : ")
                console.log(req.body)
                let userId = req.params.userId;
                let pathToSave = `./public/uploads/${userId}/store`;
                fs.mkdirsSync(pathToSave);
                callback(null, pathToSave);
            },
            filename: (req, file, callback) => {
                callback(null, uuidv1() + path.extname(file.originalname));
            }
        }),
        limits: {
            files: 5, // allow only 1 file per request
            fileSize: 5 * 1024 * 1024, // 5 MB (max file size)
        },
        fileFilter: fileFilter
    }).array('photo');

    upload(req, res, function (err) {
        console.log("req.body4 : ")
        console.log(req.body)
...
...
req.body : 
{}
req.body2: 
{}
req.body3 : 
{}
req.body4 : 
{ name: '1111111111',
  price: '1212',
  cid: '1',
...

我发现如果我使用.any()而不是.array('photo'),那么我可以访问字段和文件。但问题仍然是,它首先上传这些文件,然后让我访问位于console.log(“req.body4:”)底部的uploads函数中的那些字段所以问题仍然是,在我需要使用这些字段进行验证之前,先上载文件。

您应该在
正文中只接收一个对象,这样您就可以像访问任何其他对象一样访问它

{
  object1: 'something here',
  object2: {
    nestedObj1: {
      something: 123,
      arrInObj: ['hello', 123, 'cool'],
  }
}
然后你就可以像这样访问这些东西:

console.log(req.body.object1)/“这里有些东西”
console.log(req.body.object2.nestedObj1[0])/“hello”
console.log(req.body.object2.nestedObj1.forEach(item=>console.log(item))/'hello'123'cool'

是的,我应该在req.body中接收到一些东西,但正如上面的输出所说,在我进入上传函数之前,我不会在req.body中接收到任何东西,这是在multer上传文件之后访问的。我在express设置中有“server.use(bodyParser.json())”和“server.use(bodyParser.urlcoded({extended:true}))。不过,我发现如果我使用.any()我可以访问字段和文件,而不是.array('photo')。但问题是,它首先上载这些文件,然后让我可以访问位于控制台.log(“req.body4:”)底部的uploads函数中的那些字段是的。所以问题仍然是在我需要使用这些字段进行验证之前先上传文件。你找到解决方案了吗?或者multer的其他替代方案这非常重要。