Как сделать запрос данных формы с помощью koa?

Я пытаюсь воспроизвести поведение формы входа через koa.

Форма входа делает:

<form id="loginForm" method="post" action="http://myaddress:3000/auth" enctype="multipart/form-data">

Я использую коа-запрос и form-data:

var form = new FormData();
form.append('identification', 'userId');
form.append('password', 'userPassword');

var options = {
    url:            DB_SERVER_URL + 'auth',
    method:         'POST',
    formData:       form
};

var response = yield request(options);
console.log('response.statusCode: ' + response.statusCode);

Но я всегда получаю ответ 400.

Я пробовал просто использовать form.submit(DB_SERVER_URL + 'auth', function(err, res) { ... }, который работает, но мне нравится функциональность yield koa, и в идеале я хочу избежать обратных вызовов.

Любые идеи?


person Felix    schedule 06.10.2014    source источник
comment
Так что я подумал, эй, ОП действительно пытается делать то же самое, что и я, круто... и тут я прочитал твое имя.   -  person Félix Adriyel Gagnon-Grenier    schedule 25.11.2016
comment
Ха-ха, какие шансы :)   -  person Felix    schedule 25.11.2016


Ответы (3)


Koa принимает несколько входных данных yield, которые могут быть более или менее легко получены из вашего текущего кода в зависимости от вашей текущей настройки:

  • Обещание. Поскольку form-data их не использует, мы создадим его с Q

    var Q = require('q');
    
    var promise = Q.ninvoke(form, "submit", DB_SERVER_URL + 'auth');
    var response = yield promise;
    console.log('response.statusCode: ' + response.statusCode);
    
  • или преобразователь, функция-оболочка, которую вы использовали в своем ответе, но есть библиотеки, которые могут обрабатывать обертку для вас (здесь, thunkify-wrap):

    var thunkify = require('thunkify-wrap');
    
    var submit = thunkify(form.submit, form); // the context is needed in this case
    var response = yield submit(DB_SERVER_URL + 'auth');
    console.log('response.statusCode: ' + response.statusCode);
    
person nikoshr    schedule 08.10.2014
comment
Круто, я использовал Q для отправки формы. У меня проблемы с response.on("data", callback), потому что обратный вызов не выдает ошибку. Любая идея, как я буду использовать Q или thunkify для этого? - person Felix; 10.10.2014
comment
thunkify-wrap может обрабатывать события, например var evnts = thunkify.event(response, 'data'); var data = yield evnts(); - person nikoshr; 10.10.2014

В итоге я использовал form.submit(DB_SERVER_URL + 'auth', function(err, res) { ... }, но обернул обратные вызовы, чтобы можно было использовать yield для поддержки синхронного потока управления.

Вот моя оболочка для обратного вызова form.submit для получения ответа:

function makeLoginRequest(formData) {

    var form = new FormData();
    form.append('identification', formData.identification);
    form.append('password', formData.password);
    var DB_SERVER_URL = 'http://myurl:3000/';

    return function(callback) {
        form.submit(DB_SERVER_URL + 'auth', function(error, response) {
            callback(error, response);
        });
    }
}

А вот моя оболочка для обратного вызова для получения тела ответа:

function getLoginResponseData(response) {

    return function(callback) {
        response.on("data", function(chunk) {
            callback(null, chunk);
        }); 
    }
}

Это позволяет мне использовать yield для поддержки синхронного потока управления:

var response = yield makeLoginRequest(this.request.body);
console.log('response.statusCode: ' + response.statusCode);

var chunk = yield getLoginResponseData(response);
console.log("BODY: " + chunk);

Я новичок в узле и коа, поэтому, если у вас есть лучший способ, дайте мне знать!

person Felix    schedule 07.10.2014

Если вы используете koa-request, я смог это сделать.

const request = require('koa-request');

const response = yield request({
 method: 'POST',
    url: 'https://whatsever.com',
    form: {
     itema: 'vala',
     itemb: 'valb',
    },
    headers: {
      'Content-type': 'application/x-www-form-urlencoded'
    }
  });

this.body = response.body;

Если вам нужна составная часть, посмотрите здесь: https://www.npmjs.com/package/request#multipartform-data-multipart-form-uploads.

Помните, что koa-request является оберткой для модуля request.

person Sagivf    schedule 08.04.2016