如何在NodeJS / Multer中以相同的形式发送字段和文件?

Ami*_*ran 2 node.js express multer

我的问题是发布到/ new时无法获取req.body和req.file对象,但是一切都很好,并且文件正在我的文件夹中上传。我只是无法访问req.body和req.file对象。当我在控制台中登录req.body时,它返回[object Object],而对于req.file,它记录为未定义。

我已经进行了一些研究,发现无法使用body-parser编码multipart / form-data,但是我需要使用它,因为没有它我就无法发送文件。

var router = require('express').Router(),
    multer = require('multer'),
    path = require('path'),
    passport = require('passport'),
    middleware = require('../middleware'),
    User = require('../models/User'),
    Ad = require('../models/Ad');

// Storage setup
var storage = multer.diskStorage({
  destination: './public/uploads/',
  filename: function(req, file, done) {
    done(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
  }
});

// Upload setup
var upload = multer({
  storage: storage,
  limits: {
    fileSize: 3000000
  }
}).single('banner');

// Check file type
function checkFileType(file, callback) {
  // Allowed extensions
  var fileTypes = /jpeg|jpg|png|gif/;
  // Check extention
  var extname = fileTypes.test(path.extname(file.originalname).toLowerCase());
  // Check mime type
  var mimeType = fileTypes.test(file.mimetype);

  if (mimeType && extname) {
    return callback(null, true);
  }
  callback(null, false);
}

router.get('/new', middleware.isLoggedIn, function(req, res) {
  res.render('new');
});

router.post('/new', middleware.isLoggedIn, function(req, res) {
  var adObj = {
    owner: req.user,
    url: req.user.url,
    paymentType: req.body.paymentType,
    transactionId: '',
    banner: ''
  };

  if (adObj.paymentType === 'paid') {
    adObj.transactionId = req.body.transactionId;
  }

  upload(req, res, function(err) {
    if (err) {
      req.flash('error', err.message);
      return res.redirect('/new');
    }
    adObj.banner = '/uploads/' + req.file.filename;
  });

  var ad = new Ad(adObj);
  ad.save();

  req.flash('success', 'Successfully added new ad.');
  res.redirect('/');
});
Run Code Online (Sandbox Code Playgroud)
var router = require('express').Router(),
    multer = require('multer'),
    path = require('path'),
    passport = require('passport'),
    middleware = require('../middleware'),
    User = require('../models/User'),
    Ad = require('../models/Ad');

// Storage setup
var storage = multer.diskStorage({
  destination: './public/uploads/',
  filename: function(req, file, done) {
    done(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
  }
});

// Upload setup
var upload = multer({
  storage: storage,
  limits: {
    fileSize: 3000000
  }
}).single('banner');

// Check file type
function checkFileType(file, callback) {
  // Allowed extensions
  var fileTypes = /jpeg|jpg|png|gif/;
  // Check extention
  var extname = fileTypes.test(path.extname(file.originalname).toLowerCase());
  // Check mime type
  var mimeType = fileTypes.test(file.mimetype);

  if (mimeType && extname) {
    return callback(null, true);
  }
  callback(null, false);
}

router.get('/new', middleware.isLoggedIn, function(req, res) {
  res.render('new');
});

router.post('/new', middleware.isLoggedIn, function(req, res) {
  var adObj = {
    owner: req.user,
    url: req.user.url,
    paymentType: req.body.paymentType,
    transactionId: '',
    banner: ''
  };

  if (adObj.paymentType === 'paid') {
    adObj.transactionId = req.body.transactionId;
  }

  upload(req, res, function(err) {
    if (err) {
      req.flash('error', err.message);
      return res.redirect('/new');
    }
    adObj.banner = '/uploads/' + req.file.filename;
  });

  var ad = new Ad(adObj);
  ad.save();

  req.flash('success', 'Successfully added new ad.');
  res.redirect('/');
});
Run Code Online (Sandbox Code Playgroud)

Muk*_*rma 5

之所以会出现错误,是因为您尝试在实际解析之前进行访问multer。您正确地指出了这body-parser不适用于multipart-data,但是以multipart-data表格类型 multer可以同时解析file和中的其他字段form,这就是为什么我们可以同时访问req.file和的原因req.body

确保您访问它 upload(req, res, function(err) { // req.body and req.file })

此外,还有一个与异步代码有关的问题。

解:

router.post('/new', middleware.isLoggedIn, function(req, res) {
    upload(req, res, function(err) {
       if (err) {
          req.flash('error', err.message);
          return res.redirect('/new');
       }

       var adObj = {
          owner: req.user,
          url: req.user.url,
          paymentType: req.body.paymentType,
          transactionId: '',
          banner: ''
       };

       if (adObj.paymentType === 'paid') {
         adObj.transactionId = req.body.transactionId;
       }

       adObj.banner = '/uploads/' + req.file.filename;

       var ad = new Ad(adObj);
       ad.save();

       req.flash('success', 'Successfully added new ad.');
       return res.redirect('/');
    });
});
Run Code Online (Sandbox Code Playgroud)