首页 > 解决方案 > 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);
        });
    });
});

标签: javascriptrequest

解决方案


尝试在顶层使用 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);

推荐阅读