2015-08-26 2 views
5

Я создал API с использованием io.js и koa.js.Доступ к необработанному телу запроса в koa.js

В качестве прокси-сервера для парсера я использую koa-body, который, в свою очередь, использует co-body.

На одной из моих конечных точек API я получаю запросы POST, и мне нужен доступ к необработанному телу запроса, потому что мне нужно его закодировать, чтобы проверить, действительно ли запрос.

Есть ли способ получить доступ к необработанному телу запроса? Я пытался использовать промежуточное программное обеспечение raw-body, но если я его использую до того, как позвоню koa-body, то co-body используется в koa-body. Если я использую его после koa-body, он не работает.

app.use(function*(next){ 
    let rawRequestBody = yield rawBody(this.req); 
    this.rawRequestBody = rawRequestBody; 

    yield next; 
    }); 

EDIT:

Я думаю, что я нашел обходной путь, но я не знаю, если это лучшее решение. Я думаю, что ответ @greim может быть лучшим решением этой проблемы.

Я добавил следующий код, прежде чем я использую koa-body:

app.use(function *(next) { 

    let url = this.req.url; 

    if(this.req.method == 'POST') { 
     let that = this; 
     this.req.rawBody = ''; 

     this.req.on('data', function(chunk) { 
     that.req.rawBody += chunk; 
     }); 
    } 

    yield next; 
    }); 

ответ

6

Это имеет смысл только, чтобы захватить поток сразу.

Вы можете захватить тело запроса как строку или буфер (я предполагаю, что это то, что вы подразумеваете под «необработанным» телом), используя утилиту raw-body, а затем сохраняйте ссылку на нее, как показано в вашем собственном коде, так что :

let rawRequestBody = yield rawBody(this.req); 
this.rawRequestBody = rawRequestBody; 
console.log(typeof this.rawRequestBody); // "string" 

После того, как вы сделаете это, не использовать koa-body или co-body, так как те же поток захвата утилиты, предположим, что вы еще не захватили поток. Для того, чтобы тело запроса доступен в формате JSON (например), просто сделать это:

this.jsonRequestBody = JSON.parse(this.rawRequestBody); 
console.log(typeof this.jsonRequestBody); // "object" 
1

Почему мы не можем использовать несколько парсер тела (совместное тело, КоА-тела), потому что по Defination он должен подготовить CTX. request.body для последующего использования промежуточного программного обеспечения, это означает, что промежуточное ПО для анализатора тела «ждет следующий()», чтобы передать управление следующему промежуточному программному обеспечению, ctx.req потребляется (или заканчивается).

Любое связующее средство для анализатора тела для координации с другим потребителем тела запроса (тот, который прослушивает «данные» или «завершает» событие на ctx.req), должен заставить его «синхронизировать» события прослушивания (например, «данные» или «конец»)) на ctx.req. Это не относится к совместному телу и коа-телу (используйте со-тело), ​​которые делают это в «Promise.resolve()», а затем «если события« данные »или« конец »запускаются до того, как вы прослушаете это событие, данные отсутствуют (потерять «данные») или произойдет ошибка (прослушивание по потоку).

@greim прав, но большую часть времени мы используем промежуточное ПО высокого уровня (например, joi-router), которое имеет силу использовать промежуточное программное обеспечение для анализатора тела, и мы не имеем контроля, это все еще проблема.

+0

Мое исправление на сопутствующем теле: https://github.com/cojs/co-body/pull/59 – tangxinfa

 Смежные вопросы

  • Нет связанных вопросов^_^