3

我正在尝试通过 koa 复制登录表单的行为。

登录表单执行以下操作:

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

我正在使用koa 请求表单数据模块:

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) { ... }which 工作,但我喜欢 koa 的 yield 功能,理想情况下我想避免处理回调。

有任何想法吗?

4

3 回答 3

1

Koa 接受多个产量输入,这些输入可以或多或少地从您当前的代码中获得,具体取决于您当前的设置:

  • 一个承诺。由于 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);
    
  • 或 thunk,即您在答案中使用的包装函数,但有些库可以为您处理包装(此处为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);
    
于 2014-10-08T09:07:57.367 回答
0

我最终使用了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);

我是 node 和 koa 初学者,所以如果您有更好的方法,请告诉我!

于 2014-10-07T22:03:32.153 回答
0

如果您使用的是 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 模块

于 2016-04-08T08:23:11.103 回答