2014-10-21 8 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, он отлично работает.

Любые идеи?


EDIT

Я использую koa-route.


EDIT 2

Просто понял, я использую koa-body-parser, который, вероятно, более актуальной.

+1

Какое промежуточное программное обеспечение используется для анализа тела запроса? –

+0

Я использую 'koa-route', который, кажется, автоматически анализирует тело запроса? – Felix

ответ

1

Попробуйте использовать анализатор КоА тела:

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

Я думаю КоА-маршрутизатор будет анализировать типичный запрос материал, URL Params, форму и т.д. Если вы хотите, чтобы разобрать тело запроса, который содержит JSON объект вам нужно применить промежуточное программное обеспечение (в качестве alex намечено).

Также, пожалуйста, проверьте, если вы ставите действительный JSON.

Взгляните на этот Коа-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; 
    }; 

там выглядит предел 1mb на сумму JSON. затем в 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

+0

Ум нет - вам может понадобиться копать исходный код. Это что-то новое. – akaphenom

+0

добавил некоторые сведения – akaphenom