我试图通过koa复制登录表单的行为。
登录表单确实:
<form id="loginForm" method="post" action="http://myaddress:3000/auth" enctype="multipart/form-data">
我正在使用koa request和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) { ... }
,但我喜欢koa的yield功能,理想情况下我想避免处理回调。
有什么想法吗?
答案 0 :(得分:1)
Koa接受多个输出输入,可以根据您当前的设置,或多或少地从您当前的代码中获取:
承诺。由于表单数据似乎没有使用它们,我们将创建一个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);
答案 1 :(得分: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);
我是节点和koa初学者,所以如果你有更好的方法,请告诉我!
答案 2 :(得分: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
模块