0

我正在尝试通过 HTTPS 请求将服务器的 IP(在本例中为我的计算机公共 IP)发送到另一台服务器以访问其 API。我已经完成了服务器身份验证,并且有了我的不记名令牌。我正在使用 Express 和 NPM 进行服务器端编程。我得到我的IP地址如下:

var ipAddress;
publicIp.v4().then(ip => {
  ipAddress = ip;
  console.log(ip);
});

我提出如下要求。

request({

  //Set the request Method:
  method: 'POST',
  //Set the headers:
  headers: {
    'Content-Type': 'application/json',
    'Authorization': "bearer "+ token,  //Bearer Token
    'X-Originating-Ip': ipAddress  //IP Address
  },
  //Set the URL:
  url: 'end point url here',
  //Set the request body:
  body: JSON.stringify( 'request body here'
  }),
}, function(error, response, body){

  //Alert the response body:
  console.log(body);
  console.log(response.statusCode);
 });
}

我收到 401 错误。我做过研究,我相信这与发送 IP 地址有关。我在标题中正确发送了吗?

4

2 回答 2

0

这是一个典型的异步问题。要发送ipAddress,您需要先保证它已经被分配了一个值。

在您的代码中:

var ipAddress;
publicIp.v4().then(ip => {
  ipAddress = ip;
  console.log(ip);
});
// code x

通常publicIp.v4()异步操作(例如来自 OpenDNS 的查询)code x在之前执行ipAddress = ip;,这意味着如果您的request(...)语句就在之后publicIp.v4().then(...),它将与ipAddressas一起执行undefined

即使request(...)语句在其他地方执行,一段时间后,也不能保证它ipAddress已经准备好——publicIp.v4().then(...)可能会花费很多时间。

要解决此问题,您需要放入request(...)异步操作的回调中,例如:

var ipAddress;
publicIp.v4().then(ip => {
  ipAddress = ip;
  console.log(ip);
  request(...);
});
于 2017-09-15T03:33:11.210 回答
0

问题很简单。请求标头的授权部分存在问题。行内容如下:

'Authorization': "bearer "+ token,  //Bearer Token

应改为:

'Authorization': "Bearer "+ token,  //Bearer Token

Authorization标头区分大小写。它必须是资本,否则您将被拒绝访问。

于 2017-09-15T08:55:30.303 回答