0

我想使用一些节点获取代码连接到外部 api。我的代码首先发送登录详细信息,并且应该从 api 接收令牌。然后这个令牌用于所有以后的通信。

这是代码:

import fetch from 'node-fetch';
function getTokenForAuth(info) {
    try {
        var auth_token = '';
        fetch(api_url + '/api/api-token/', {
            method: 'POST',
            body: JSON.stringify(info),

            headers: {
                'Content-Type': 'application/json',
                'Accept': 'application/json'
            }
        })
        .then(function(res) {
            return res.json();
        })
        .then(function(json) {
            auth_token = json;
        })
        return auth_token.token;
    }

    catch (e) {
        console.log('[-] Error: Token Not Received');
        console.log('[!] Exception: ' + e);
    }
}

function getJSONFromRelativeURL(relativeURL, info) {
    return fetch(`${api_url}${relativeURL}`, {
        method: 'GET',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': 'Token ' + getTokenForAuth(info)
        }
    })
    .then(function(res) {
        console.log(res);
        return res.json();
    })
    .then(function(json) {
        console.log(json);
    })
}

getJSONFromRelativeURL()函数的请求标头中,如果我对令牌进行硬编码,我会得到正确的结果。但是如果我现在运行代码,我会收到一条错误消息:{ detail: 'Invalid token.' }

我认为这是因为 fetch 函数中 promise 的异步性质,因此它有时无法在getJSONFromRelativeURL()被调用之前及时发送令牌。我不确定这个假设并且不知道如何纠正这个假设。

4

2 回答 2

2

你的问题在这里:

.then(function(json) {
    auth_token = json;
})
return auth_token.token;

您的return声明在 Promise 链之外。这意味着,在您点击return时,fetch请求甚至还没有机会运行。你基本上只是告诉fetchPromise 链在它返回时要做什么。

所以本质上

我认为这是因为 fetch 函数中 promise 的异步性质,因此它有时无法在调用 getJSONFromRelativeURL() 之前及时发送令牌。

是 100% 正确的。

您需要做的是稍微重组一下:

function getTokenForAuth(info) {
  return fetch(api_url + "/api/api-token/", {
    method: "POST",
    body: JSON.stringify(info),

    headers: {
      "Content-Type": "application/json",
      Accept: "application/json"
    }
  }).then(function(res) {
    return res.json();
  });
}

function getJSONFromRelativeURL(relativeURL, info) {
  return getTokenForAuth(info)
    .then(function(token) {
      return fetch(`${api_url}${relativeURL}`, {
        method: "GET",
        headers: {
          "Content-Type": "application/json",
          Authorization: `Token ${token}`
        }
      });
    })
    .then(function(res) {
      console.log(res);
      return res.json();
    })
    .then(function(json) {
      console.log(json);
    });
}
于 2017-08-05T16:37:24.047 回答
1

尚未对其进行测试,但它看起来类似于以下内容。对于错误处理,在每个链的末尾使用 .catch(()=>{}) 。

   function getTokenForAuth(info) {

            var auth_token = '';
            return fetch(api_url + '/api/api-token/', {
                method: 'POST',
                body: JSON.stringify(info),

                headers: {
                    'Content-Type': 'application/json',
                    'Accept': 'application/json'
                }
            })
            .then(function(res) {
                return res.json();
            })
           }


    function getJSONFromRelativeURL(relativeURL, info, token) {
        return fetch(`${api_url}${relativeURL}`, {
            method: 'GET',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': 'Token ' + token
            }
        })
        .then(function(res) {
            console.log(res);
            return res.json();
        })
        .then(function(json) {
            console.log(json);
        })
    }


    getTokenForAuth(info)
    .then((token)=>{
      return getJSONFromRelativeURL(relativeURL, info, token)
    })
于 2017-08-05T16:24:45.090 回答