Eric
Eric

Reputation: 488

Express js 4 and multer

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

Answers (3)

codejockie
codejockie

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

mscdex
mscdex

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

Elyas74
Elyas74

Reputation: 548

add bodyParser with this code :

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));

Upvotes: 1

Related Questions