2014-10-21 85 views
1

我做了如下要求我koajs服務器:爲什麼PUT請求體未定義?

$.ajax({ 
    type  : 'PUT',  // this.request.body undefined server side 
    // type   : 'POST', // this.request.body all good server side 
    url   : url, 
    data  : body, 
    dataType : 'json' 
}) 

但在服務器端this.request.body永遠是不確定的。

如果我將請求類型更改爲POST,它工作正常。

任何想法?


編輯

我使用koa-route


EDIT 2

剛剛意識到我使用的是koa-body-parser,這可能是更相關。

+1

你用什麼中間件來解析請求體? – 2014-10-22 00:08:45

+0

我使用'koa-route',這似乎是自動解析請求正文? – Felix 2014-10-22 00:36:09

回答

1

嘗試使用KOA體解析器:

const bodyParser = require('koa-bodyparser') 
app.use(bodyParser()) 

我覺得如果要分析包含一個JSON的請求體KOA路由器將解析典型要求的東西,網址參數,表格等。對象你需要申請一箇中間件(如亞歷克斯暗示)。

此外請檢查您是否正在使用有效的JSON。

看看這個KOA-bodyparser:

/** 
* @param [Object] opts 
* - {String} jsonLimit default '1mb' 
* - {String} formLimit default '56kb' 
* - {string} encoding default 'utf-8' 
*/ 

    return function *bodyParser(next) { 
    if (this.request.body !== undefined) { 
     return yield* next; 
    } 

    if (this.is('json')) { 
     this.request.body = yield parse.json(this, jsonOpts); 
    } else if (this.is('urlencoded')) { 
     this.request.body = yield parse.form(this, formOpts); 
    } else { 
     this.request.body = null; 
    } 

    yield* next; 
    }; 

有看起來是對JSON量的1MB限制。然後co-body/lib/json.js

module.exports = function(req, opts){ 
    req = req.req || req; 
    opts = opts || {}; 

    // defaults 
    var len = req.headers['content-length']; 
    if (len) opts.length = ~~len; 
    opts.encoding = opts.encoding || 'utf8'; 
    opts.limit = opts.limit || '1mb'; 

    return function(done){ 
    raw(req, opts, function(err, str){ 
     if (err) return done(err); 

     try { 
     done(null, JSON.parse(str)); 
     } catch (err) { 
     err.status = 400; 
     err.body = str; 
     done(err); 
     } 
    }); 
    } 
}; 
+0

爲響應而歡呼!嗯,我剛剛意識到我已經在使用'koa-body-parser' ...任何想法爲什麼它解析POST的請求體而不是PUT? – Felix 2014-10-22 03:16:55

+0

嗯不 - 你可能需要挖掘源代碼。 koa的東西很新。 – akaphenom 2014-10-22 16:16:18

+0

增加了一些細節 – akaphenom 2014-10-22 16:22:32