Express js form data
Javascriptnode.jsExpressConnectJavascript Problem Overview
Can someone please tell me the recommended (up to date) way to get POSTed form data in express.
So many tutorials/ posts etc talk about bodyParser but this is no longer bundled with Express and other blogs etc recommend using urlencoded directly, but now this is not available either.
Trying to find accurate information on these frameworks or technologies is doing my head in.
BTW what I am intrerested in is very simple and small form data
Javascript Solutions
Solution 1 - Javascript
You should install body-parser
through npm-install
. Now it comes as a separate middleware.
After that add following line in your app.js
var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
// in latest body-parser use like below.
app.use(bodyParser.urlencoded({ extended: true }));
It parses the post
request as an object
. You will get your variables in req.body
.
In your post
request handler.
app.post('/post',function(request,response){
console.log(request.body) //you will get your data in this as object.
})
Edit 1
The answer above was for the question specifically asked, the OP was looking for the bodyParser
(deprecated) which was not part of express
anymore.
Since the title of the question is very generic and the answer doesn't include all aspects of form-data
, I will put @StLia's answer as an edit.
Body-Parser Readme >This does not handle multipart bodies, due to their complex and typically large nature. For multipart bodies, you may be interested in the following modules:
Solution 2 - Javascript
You can make use of express-formidable module to that. install 'express-formidable' by the following command
npm install express-formidable
the simple example is as follows
const express = require('express');
const formidable = require('express-formidable');
var app = express();
app.use(formidable());
app.post('/upload', (req, res) => {
//req.fields contains non-file fields
//req.files contains files
res.send(JSON.stringify(req.fields));
});
Solution 3 - Javascript
From the README of body-parser:
> This does not handle multipart bodies, due to their complex and > typically large nature.
The above is going to work with x-www-form-urlencoded
and json
but it will NOT work with any multipart
. form-data
is also multipart
with the header multipart/form-data
.
In case of form-data
, your best solution would be to use express-formidable.
Solution 4 - Javascript
Besides the solutions with formidable
, there is another module which I have been using in my recent projects since 2019. The module express-form-data can be easily declared in your server file like:
const express = require('express');
const formData = require('express-form-data');
app.use(formData.parse());
app.post('/image-upload', (req, res) => {
console.log(req.files);
})
...
In case of image uploading, for instance, req.files
will provide all relevant data you need for handling the files such as path, size, filename, etc.
Solution 5 - Javascript
I noticed @HubballiHuli answer was to use a package called express-formidable. You don't need to use this unnecessary package, it provide one (small) file of code. Instead you can do it yourself (now removing the dependency).
Here is the formidableMiddleware file:
'use strict';
const formidable = require('formidable');
function parse(opts, events) {
return (req, res, next) => {
if (req.express_formidable && req.express_formidable.parsed) {
next();
return;
}
const form = new formidable.IncomingForm();
Object.assign(form, opts);
let manageOnError = false;
if (events) {
events.forEach((e) => {
manageOnError = manageOnError || e.event === 'error';
form.on(e.event, (...parameters) => { e.action(req, res, next, ...parameters); });
});
}
if (!manageOnError) {
form.on('error', (err) => {
next(err);
});
}
form.parse(req, (err, fields, files) => {
if (err) {
next(err);
return;
}
Object.assign(req, { fields, files, express_formidable: { parsed: true } });
next();
});
};
}
module.exports = parse;
exports.parse = parse;
Now on how to use it:
const express = require('express');
const formidableMiddleware = require('./formidableMiddleware.js');
var app = express();
app.use(formidableMiddleware());
app.post('/upload', (req, res) => {
//req.fields contains non-file fields
//req.files contains files
res.send(JSON.stringify(req.fields));
});
I wrote an article on unnecessary packages a while ago and why not to use them: https://medium.com/@alexjamesdunlop/unnecessary-packages-b3623219d86
Solution 6 - Javascript
>Express 4.16+ has implemented their own version of body-parser so you do not need to add the dependency to your project. You can run it natively in express
app.use(express.json()); // Used to parse JSON bodies
app.use(express.urlencoded()); // Parse URL-encoded bodies using query-string library
// or
app.use(express.urlencoded({ extended: true })); // Parse URL-encoded bodies using qs library