javascript - Javascript 请求库避免深度嵌套
问题描述
下面的代码有效,但我怎样才能避免这种请求的嵌套?
目标是打开urlBriefArea
需要设置 cookie 以及身份验证的页面。
第一个 GET 请求是获取 cookie 值,第二个是登录的 POST,第三个是我想要的页面。
我试图按顺序在所有请求中传递 cookieJar,但它似乎没有效果。
var request = require('request');
var cookieJar = request.jar();
var request = request.defaults({jar: true})
var loginUrl = 'http://www.nats-uk.ead-it.com/fwf-natsuk/public/user/account/login.faces';
request.get({url: loginUrl, jar: cookieJar}, function() {
var postParameters = {
'j_username': process.env.NATS_USERNAME,
'j_password': process.env.NATS_PASSWORD,
'mainForm:login': 'Login',
'mainForm_SUBMIT': '1',
'mainForm:_idcl': '',
'mainForm:_link_hidden_': '',
'javax.faces.ViewState': 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAN0AAExcHQAHy9wdWJsaWMvdXNlci9hY2NvdW50L2xvZ2luLmpzcHg='
}
request.post({url: loginUrl, jar: cookieJar, formData: postParameters, followRedirect: false},
function optionalCallback(error, response, body) {
var cookie_string = cookieJar.getCookieString(loginUrl);
var cookies = cookieJar.getCookies(loginUrl);
console.log(response.request.headers);
console.log('statusCode:', response && response.statusCode);
console.log('body:', body);
var urlBriefArea = 'http://www.nats-uk.ead-it.com/fwf-natsuk/restricted/user/ino/brief_aerodrome.faces';
request({url: urlBriefArea, jar: cookieJar}, function (error, response, body) {
console.log('statusCode:', response && response.statusCode);
console.log('body:', body);
});
});
});
解决方案
尝试在顶层使用 Promise 和函数。
const rp = require('request-promise-native');
var cookieJar = rp.jar();
var loginUrl = 'http://www.nats-uk.ead-it.com/fwf-natsuk/public/user/account/login.faces';
var postParameters = {
'j_username': process.env.NATS_USERNAME,
'j_password': process.env.NATS_PASSWORD,
'mainForm:login': 'Login',
'mainForm_SUBMIT': '1',
'mainForm:_idcl': '',
'mainForm:_link_hidden_': '',
'javax.faces.ViewState': 'rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAN0AAExcHQAHy9wdWJsaWMvdXNlci9hY2NvdW50L2xvZ2luLmpzcHg='
}
function openLogin()
{
return rp.get({url: loginUrl, jar: cookieJar});
}
function login() {
return rp.post({url: loginUrl, jar: cookieJar, formData: postParameters,
followRedirect: false, simple: false},
handlePostLogin)
}
function handlePostLogin(error, response, body) {
var cookie_string = cookieJar.getCookieString(loginUrl);
var cookies = cookieJar.getCookies(loginUrl);
console.log(response.request.headers['cookie']);
console.log('statusCode:', response && response.statusCode);
}
function getAerodrome(result) {
var urlBriefArea = 'http://www.nats-uk.ead-it.com/fwf-natsuk/restricted/user/ino/brief_aerodrome.faces';
return rp.get({url: urlBriefArea, jar: cookieJar, resolveWithFullResponse: true});
}
function handleUrlBriefArea(response)
{
console.log('statusCode:', response && response.statusCode);
console.log(response.body.includes('Ricardo'));
}
openLogin()
.then(login)
.then(getAerodrome)
.then(handleUrlBriefArea);
推荐阅读
- c - C - 我从同一个变量中得到两个不同的指针
- hangouts-chat - GHC 房间中的 Google ChatBot 访问限制
- c++ - 出现错误:“无法使用 cgo 确定 C.functionName() 的名称类型”
- reactjs - 如何在 react 或 native 中将文本和图像共享到 instagram?
- c - 版本号作为字符串被截断为单个数字
- python - OSMNX 不返回所有欧洲首都的图表
- java - 为什么侦听器没有绑定到我分配给它的对象?
- swift - 将字符串转换为 NSDate - 致命错误:在展开可选值时意外发现 nil
- c# - 如何在 .NET EF Core 中实现自引用多对多关系
- c# - c# - 如何使用Loop来验证一个对象是否在c#WF中与另一个对象Bounds绑定Intersets?