user1870012
user1870012

Reputation: 59

i can't get POST data when i use express

Here are my codes:

var express = require('express');
var app = express();

app.get('/:name', function(req,res){
    res.setHeader('Content-Type','text/html');
    res.send('<form action="/" method="POST"><input type="text" name="self"/><input type="submit"/></form>');
});

app.post('/',function(req,res){
    res.send(req.body.self);
});

app.listen(8080);

I call localhost:8080/examplename

and write something inside of input, and I click submit button. It goes to localhost:8080 but node returns error as below:

TypeError: Cannot read property 'self' of undefined
    at /home/yusuf/Masaüstü/node/ue.js:10:19
    at callbacks (/home/yusuf/Masaüstü/node/node_modules/express/lib/router/index.js:160:37)
    at param (/home/yusuf/Masaüstü/node/node_modules/express/lib/router/index.js:134:11)
    at pass (/home/yusuf/Masaüstü/node/node_modules/express/lib/router/index.js:141:5)
    at Router._dispatch (/home/yusuf/Masaüstü/node/node_modules/express/lib/router/index.js:169:4)
    at Object.router [as handle] (/home/yusuf/Masaüstü/node/node_modules/express/lib/router/index.js:32:10)
    at next (/home/yusuf/Masaüstü/node/node_modules/express/node_modules/connect/lib/proto.js:190:15)
    at Object.expressInit [as handle] (/home/yusuf/Masaüstü/node/node_modules/express/lib/middleware.js:31:5)
    at next (/home/yusuf/Masaüstü/node/node_modules/express/node_modules/connect/lib/proto.js:190:15)
    at Object.query [as handle] (/home/yusuf/Masaüstü/node/node_modules/express/node_modules/connect/lib/middleware/query.js:44:5)

Upvotes: 2

Views: 1444

Answers (3)

David Adrian
David Adrian

Reputation: 1109

You need to enable the body parser middleware. Insert this before you configure your routes.

app.use(express.bodyParser());

You can also configure other things here, such as the view engine, static directory, etc. For example,

app.set('views', __dirname + '/views');
app.set('view engine', 'swig');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/public'));

Upvotes: 4

hunterloftis
hunterloftis

Reputation: 13799

You need the bodyParser. Here is your exact code, with the parser added, and working as expected:

var express = require('express');
var app = express();

// parses POST bodies:
app.use(express.bodyParser());

app.get('/:name', function(req,res){
    res.setHeader('Content-Type','text/html');
    res.send('<form action="/" method="POST"><input type="text" name="self"/><input type="submit"/></form>');
});

app.post('/',function(req, res){
  res.send(req.body.self);
});

app.listen(8080);

Upvotes: 0

sheldonk
sheldonk

Reputation: 2684

req.body allows you to get the data sent in POST. You can then use req.body.[name of data] to actually access data. For example, if you sent a "firstname":

req.body.firstname

You can also use res.render to send data to your template page. For example, this sends the firstname to your index page rendered by your templating language.

res.render('index', {fname: req.body.firstname});

Upvotes: 1

Related Questions