2014-03-03 43 views
7

不確定我有KOA象下面這樣:請求體在KOA

var koa = require('koa'), 
bodyParser = require('koa-body-parser'), 
router = require('koa-router'), 
app = koa(); 
app.use(router(app)); 
app.use(bodyParser()); 
app.post('http://localhost/get',getit); 

function *getit(){ 
console.log(this.req.body); //undefined 
} 

,然後通過發個帖子reqeust jQuery的AJAX:

var xhr = $.ajax({ 
      type: 'POST', 
      dataType: 'json', 
      contentType: 'application/json', 
      url: 'http://localhost/getit', 
      data: {"name":"me"}, 
      success: function(response) { 

      } 
     }); 

但在KOA和this.req我找不到我的數據。在谷歌C​​hrome開發人員工具,我可以看到標題和一切發送好,但我不能看到它在koa。

更新

正確的是:

function *getit(){ 
console.log(this.request.body); //undefined 
} 
+0

' bodyParser = require('koa-body-parser),'複製粘貼問題?這是一個沒有終止的文字字符串 – Ohgodwhy

+0

不,它不是複製粘貼,它是我的問題的模擬。即時固定qoute。 – MBehtemam

+1

我認爲它現在叫做'request'而不是'req',就像它曾經在Express中一樣。所以'console.log(this.request.body);'應該可以解決你的問題。 – bernhardw

回答

13

有趣的是,我遇到了同樣的錯誤,但我的問題是app.use()語句的排序。下面的不適合我的工作this.request.body,並返回「未定義」:

var koa = require('koa'); 
var router = require('koa-router'); 
var bodyParser = require('koa-body-parser'); 

var app = koa(); 
app.use(router(app)); 
app.use(bodyParser()); 

app.post('/login', function *() { 
    this.response.body = this.request.body; 
}); 

app.listen(3000); 

但是,如果我反轉兩個app.use()語句的順序如下:

app.use(bodyParser()); 
app.use(router(app)); 

我可以看到this.request.body中的元素。我使用koa v0.5.5,koa-body-parser v1.0.0,koa-router v3.1.2和node v0.11.12。

-1

解決方案

Acording發表評論,正確的對我來說是this.request.bodythis.req.body是不正確的。

0

koa按照您初始化它們的順序使用中間件。所以如果你在bodyparser之前插入路由器,它將無法工作。由於您的請求在到達路由器中間件之前不會傳遞給解析器,因此請求將不會被解析,並且koa將忽略request.body。所以排序非常重要。

4

我會使用co-body模塊來替代(koa-body-parser內部使用的相同模塊)。代碼應該是這樣的:

var koa = require('koa'); 
var _ = require('koa-route'); 
var parse = require('co-body'); 

var app = koa(); 

app.use(function* (next) { 
    this.req.body = yield parse(this); 
    yield next; 
}); 

app.use(_.post('/login', function*() { 
    this.body = this.req.body; 
})); 

app.listen(3000); 

var body = yield parse(this);線開了竅,解析方法試圖解析任何要求,但你可以的情況下,與parse.jsonparse.formparse.text取代它,你需要更多的控制