我想使用一些节点获取代码连接到外部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()
之前及时发送令牌。我不确定这个假设&不知道如何纠正这个问题。
答案 0 :(得分:2)
你的问题在这里:
.then(function(json) {
auth_token = json;
})
return auth_token.token;
您的return
声明不属于Promise链。这意味着,在您点击return
时,fetch
请求甚至还没有机会运行。你基本上只是在 返回时告诉fetch
Promise链要做什么。
基本上
我认为这是因为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);
});
}
答案 1 :(得分: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)
})