发送两个nodejs http请求,第二个依赖于第一个

时间:2017-12-04 01:54:19

标签: javascript node.js request

我需要使用用户名/密码组合从服务器获取令牌,然后在收到令牌后,我需要使用令牌作为标头的内容发送第二个请求。到目前为止,这就是我所拥有的:

var requestData = {
    'username': 'myUser',
    'password': 'myPassword1234'
}

var options = {
    hostname: 'localhost',
    port: 8080,
    path: '/login',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    }
}

var req = http.request(options, function(res) {
    console.log("Status: " + res.statusCode)
    res.setEncoding('utf8');
    let body = ""
    res.on('data', function (data) {
        if (res.statusCode == 200) {
            console.log("Success")
            body += data
        } else {
            invalidLogin()
        }
    })
    res.on('end', function () {
        body = JSON.parse(body)
        console.log("DONE")
        console.log(body)
        validLogin(body["token"])
    })
})
req.on('error', function(e) {
    console.log('error: ' + e.message)
})
req.write(JSON.stringify(requestData))
req.end()

然后在validLogin()(在第一个请求中调用),我有这个:

function validLogin(token) {
console.log(token)

var options = {
    hostname: 'localhost',
    port: 8080,
    path: '/dashboard',
    method: 'GET',
    headers: {
        'Authorization': token,
    }
}

var req = http.request(options, function(res) {
    console.log("Status: " + res.statusCode)
    res.setEncoding('utf8');
    let body = ""
    res.on('data', function (data) {
        if (res.statusCode == 200) {
            body += data
        } else {
            console.log(body)
        }
    })
    res.on('end', function() {
        console.log(body)
    })
})
req.on('error', function(e) {
    console.log('error: ' + e.message)
})
req.end()
}

第一个请求按预期工作并响应,但第二个请求永远不会响应。我知道正在调用该函数,因为它打印到控制台,但请求不会打印任何内容。

1 个答案:

答案 0 :(得分:0)

我会使用request-promise它使链接请求变得非常容易。 (代码未经过测试,但一般要点是准确的)

var rp = require('request-promise');

var options_login = {
  hostname: 'localhost',
  port: 8080,
  path: '/login',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  payload: JSON.stringify(requestData),
  json: true
};

var options_request = {
    hostname: 'localhost',
    port: 8080,
    path: '/dashboard',
    method: 'GET',
    json: true
};

rp(options)
  .catch(function(parsedBody){
     console.log("Error logging in.");
  })
  .then(function(parsedBody) {
     options_request.headers = {
       'Authorization': parsedBody.token,
     };

     return rp(options_request);
  })
  .catch(function(err) {
      console.log("Loading the dashboard failed...");
  });