Тело запроса не определено в КОА



У меня есть 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) {

}
});


Но в КОА и в this.req я не могу найти свои данные. в Google chrome developer tools я могу видеть заголовок и все отправить ок, но я не могу увидеть его в koa.

Обновить



Правильный ответ:



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

4 ответов:

Интересно, что я столкнулся с той же ошибкой, но моей проблемой был порядок приложения.оператор using. Ниже не работает для меня, и возвращает "неопределенный" для этого.запрос.тело:

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(bodyParser());
app.use(router(app));

Тогда я могу видеть элементы в этом.запрос.тело. Я использую КоА версии v0.5.5, КоА-тело-парсер В1.0.0, КоА-маршрутизатор В3.1.2, и узел в v0.11.12.

Вместо этого я бы использовал модуль 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 попытается проанализировать любой запрос, но вы можете заменить его на parse.json, parse.form или parse.text в случае, если вам нужно больше контроля

Koa использует промежуточное ПО в том порядке, в котором вы их инициализировали. поэтому, если вы вставите маршрутизатор перед bodyparser, он не будет работать. поскольку ваш запрос не будет передан синтаксическому анализатору до того, как он попадет в промежуточное ПО маршрутизатора, запрос не будет проанализирован, и koa проигнорирует запрос.тело. так что порядок действительно важен.

Решение

Согласно комментарию, правильным для меня является this.request.body и this.req.body не является правильным.

Comments

    Ничего не найдено.