Reputation: 2026
I've seen several posts related to this but none seem to be the problem here.
It's a very simple beginner nodejs app with expressjs on windows7
/**
* Module dependencies.
*/
var express = require('express')
, connect = require('connect')
, http = require('http')
var app = express();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
// app.use(express.bodyParser());
app.use(connect.bodyParser());
});
/**
* Routes
*/
//get requests
// app.get("/", function(req, res){
// res.send("Hello, Express!");
// });
// app.get("/hi", function(req, res){
// var message = [
// "<h1>Hello, Express!</h1>",
// "<p>Welcome to 'Building Web Apps in Node.js with Express.'</p>",
// "<p>You'll love Express because it's</p>",
// "<ul><li>Fast</li>",
// "<li>Fun</li>",
// "<li>Flexible</li>"
// ].join("\n");
// res.send(message);
// });
// app.get("/users/:userID", function(req, res){
// res.send("<h1>Hello, User #" + req.params.userID + "!");
// });
//post requests
app.post("/users", function(req, res){
// res.send(req.body);
res.send(req.body.username);
});
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
As you can see I've commented out other routes just to ensure they aren't causing the problem and I've also tried installing and using 'connect' but both express.bodyParser() and connect.bodyParser() give me the same results.
I've used chrome adv rest client extension and also tried the following simple php form.
<form action="http://localhost:3000/users" method="POST" enctype="application/x-www-form-urlencoded">
<li>
<label for="username">Username</label>
<input type="text" name="username" id="username">
</li>
<li>
<input type="submit" name="submit" id="submit">
</li>
</form>
In all cases I get a empty or undefined req.body.username and when I try just req.body in the response I get a empty object {}
UPDATE: Here is the response/request header info from chrome:
Request URL:http://localhost:3000/users
Request Method:POST
Status Code:200 OK
Request Headersview source
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:31
Host:localhost:3000
Request Payload
username=isimmons&submit=Submit
Response Headersview source
Connection:keep-alive
Date:Sat, 27 Oct 2012 23:01:45 GMT
Transfer-Encoding:chunked
X-Powered-By:Express
And Here is what I get when I send req.route
//result of console.log(req.route);
{ path: '/users',
method: 'post',
callbacks: [ [Function] ],
keys: [],
regexp: /^\/users\/?$/i,
params: [] }
Node and Express versions: express 3.0 node 0.8.9
UPDATE2 PROBLEM SEMI SOLVED See comments below. I should have just said it here. Anyway, here is the request header info from chrome when it works correctly.
Request URL:http://localhost:3000/users
Request Method:POST
Status Code:200 OK
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:26
Content-Type:application/x-www-form-urlencoded
Host:localhost:3000
Origin:http://localhost
Referer:http://localhost/nodeform.php
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.16 (KHTML, like Gecko) Chrome/24.0.1305.3 Safari/537.16
Form Dataview sourceview URL encoded
username:dfd
submit:Submit
Response Headersview source
Connection:keep-alive
Content-Length:3
Content-Type:text/html; charset=utf-8
Date:Sun, 28 Oct 2012 01:12:23 GMT
X-Powered-By:Express
Thanks
Upvotes: 2
Views: 5097
Reputation: 2026
Ok, finally came across this bug report for the rest api and simply adding the content-type resolved the issue.
The bug report has a reply to manually add the 'Content-type' header before sending. This is why the php form worked. It has the enctype set so I get the complete request header as shown above.
The correct content-type header to add manually is
Content-Type: application/x-www-form-urlencoded
Upvotes: 1