2012-07-09 76 views
0

我已經閱讀了關於如何配置express以偵聽POST請求的其他幾個問題,但是當我嘗試打印出發送到服務器的簡單POST查詢時,我不斷獲取空的JSON或未定義。在express.js中接受POST請求

我有這樣的設置:

//routes 
require('./routes/signup.js')(app); 

// Configuration 
app.configure(function(){ 
    app.use(connect.bodyParser()); 
    app.use(express.methodOverride()); 
    app.register(".html", hulk); 
    app.set('views', __dirname + '/views'); 
    app.set('view options', {layout: false}); 
    app.set('view engine', 'hulk'); 
    app.use(express.static(__dirname + '/public')); 
    app.use(app.router); 
}); 

然後routes/signup.js看起來是這樣的:

var common_functions = require('../common_functions.js'); 
var views   = require('../views/view_functions.js'); 
var globals   = require('../globals.js'); 
var mongoose   = require('mongoose'); 

//declare classes 
var User = mongoose.model('User'); 

module.exports = function(app){ 
    /** 
    * SignUp GET 
    */ 
    app.get('/signup', function(req, res){ 
     res.render('signup/signup.html'); 
    }); 

    /** 
    * SignUp POST 
    */ 
    app.post('/signup', function(req, res){ 
    console.log(JSON.stringify(req.body)); 
    console.log(req.body); 
    res.send(JSON.stringify(req.body)); 
}); 

}

模板看起來是這樣的:

{{> header.html }} 
{{> navigation.html }} 
{{> body.html }} 
<form action="/signup" method="post"> 
    <input name="email"/> 
    <input type="submit"/> 
</form> 
{{> footer.html }} 

有nothi特別感興趣的任何部分。

這兩個console.log的打印輸出未定義,而res.send()只是返回與以前相同的html。我在這裏做錯了什麼?

+0

是路由文件之前或配置塊後裝?如果在此之前,路由器中間件正在被添加到bodyParser之前的堆棧中。將路由文件移動到配置塊下面。 – 2012-07-09 15:44:02

+0

是的,完全是它。如果你願意,可以添加它作爲答案,我會接受它!謝謝。總是重要的要記住JavaScript是INTERPRETED NOT COMPILED !!! – 2012-07-09 15:46:38

回答

1

當第一次調用任何路由器的動詞功能時,Express自動掛載路由器中間件(如果尚未掛載的話)。因此,通過在配置塊之上加載路由,路由器中間件是堆棧中的第一個中間件(位於bodyParser之上)。將路由文件加載移動到配置塊下方將解決此問題。

從Express.js文檔的配置部分:

Note the use of app.router, which can (optionally) be used to mount the application routes, otherwise the first call to app.get(), app.post(), etc will mount the routes.

http://expressjs.com/guide.html#configuration