2012-10-27 180 views
2

我已經看過幾篇與此相關的文章,但沒有一篇似乎是這裏的問題。expressjs req.body.username is undefined

這是一個非常簡單的初學者用的NodeJS應用expressjs 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("https://stackoverflow.com/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')); 
}); 

正如你可以看到我已經註釋掉其他路線只是,以確保它們不會導致問題,我也嘗試安裝並使用'連接',但express.bodyParser()和connect.bodyParser()給我相同的結果。

我已經使用chrome adv rest客戶端擴展,並且還嘗試了以下簡單的php表單。

<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> 

在任何情況下,我得到一個空的或不確定的req.body.username,當我嘗試只是req.body在響應我得到一個空對象{}

UPDATE: 這裏是從鉻響應/請求頭信息:

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 

,這裏是我所得到的,當我送req.route

//result of console.log(req.route); 
{ path: '/users', 
    method: 'post', 
    callbacks: [ [Function] ], 
    keys: [], 
    regexp: /^\/users\/?$/i, 
    params: [] } 

節點和快速的版本: 表達3.0 節點0.8.9

UPDATE2問題SEMI解決 見下面的評論。我應該在這裏說過。無論如何,這是當它正常工作時,來自chrome的請求標題信息。

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 

感謝

+0

您可以刪除連接東西,使用express.bodyParser()。 Express是連接之上的一層,因此您不需要直接使用它。我的代碼中沒有看到任何奇怪的東西。我唯一能想到的是,因爲app.configure在windows上導致問題。你可以刪除app.configure。這是糖檢查NODE_ENV並根據該值執行該功能。 – Pickels

+0

您的代碼似乎沒有任何明顯的問題。你安裝了什麼版本的Express?而且,自從您提到Chrome以來,您是否[檢查了](https://developers.google.com/chrome-developer-tools/docs/network)「

'的POST請求的詳細信息,並驗證其中列出了「標題」和「表單數據?」下的「用戶名」值? –

+0

@Pickels是的我看到周圍後,連接已經是明確的node_module,所以我刪除了所有這一切。但是,當我刪除該端口的配置行時,我找不到頁面,因爲它似乎沒有對端口3000進行默認設置。 – isimmons

回答

1

好了,終於碰到這個bug報告來抓REST API和簡單地把內容類型解決了這個問題。

Bug report

的錯誤報告具有答覆發送前手動添加「內容類型」標頭。這就是php表單工作的原因。它具有enctype集,因此我得到了完整的請求標題,如上所示。

正確的Content-Type頭手動添加是

Content-Type: application/x-www-form-urlencoded