Reputation: 488
I'm writing a Node js application which handles multipart form data and so I'm using multer for the purpose.
The problem is that req.body
is always undefined.
Here is my code:
var app = express();
var http = require('http').createServer(app);
//All environments
app.set('port', process.env.PORT || config.ports.HTTP_PORT);
app.set('views', config.folders.views);
app.set('view engine', 'ejs');
//Express 4 dependencies
app.use(morgan('dev'));
app.use(multer({ dest: config.folders.uploads}))
app.use(cookieParser()); //Parser for cookie session
app.use(session({ secret: 'secret' }));
app.use(passport.initialize()); //Init passport
app.use(passport.session()); //Persistent login sessions
app.use(flash()); //Flash messages
//Public folder
app.use(express.static(config.folders.public));
require('./auth')(passport); //Add auth methods to passport
require('./routes')(app, passport); //Add routes
app.post('/test', function(req, res) {
console.log(req.body.test); //req.body always undefined
});
What could be the problem?
EDIT:
Now req.body is filled with data, but the req.files property is still undefined
Upvotes: 3
Views: 929
Reputation: 10854
Editing your original code:
You have to install Multer Multer Docs
npm i multer -S
const app = express();
const http = require('http').createServer(app);
const multer = require('multer'); // added, wasn't in your original code.
//All environments
app.set('port', process.env.PORT || config.ports.HTTP_PORT);
app.set('views', config.folders.views);
app.set('view engine', 'ejs');
//Express 4 dependencies
app.use(morgan('dev'));
// newly added
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(multer({ dest: config.folders.uploads}).single('file')) // added the single() method
app.use(cookieParser()); //Parser for cookie session
app.use(session({ secret: 'secret' }));
app.use(passport.initialize()); //Init passport
app.use(passport.session()); //Persistent login sessions
app.use(flash()); //Flash messages
//Public folder
app.use(express.static(config.folders.public));
require('./auth')(passport); //Add auth methods to passport
require('./routes')(app, passport); //Add routes
Testing the code:
app.post('/test', (req, res) => {
console.log(req.body.test); //req.body always undefined
console.log(req.file); // added this, it should work fine now.
});
Upvotes: 0
Reputation: 106698
HTML forms need to have the enctype
attribute set appropriately in order for files to be sent. Example:
<form method="POST" action="/foo" enctype="multipart/form-data">
Upvotes: 0
Reputation: 548
add bodyParser with this code :
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
Upvotes: 1