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)
之所以会出现错误,是因为您尝试在实际解析之前进行访问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)
归档时间: |
|
查看次数: |
3147 次 |
最近记录: |