我正在尝试让我的应用程序等待承诺返回,然后再执行其他依赖于该数据的代码。为此,我正在使用then()
,但是它不能按预期方式工作,因为在返回我的值之前,仍在执行下一个代码。
我正在使用Express处理请求,并使用Axios进行自己的请求。
index.js:
app.get('/api/guild/:serverId', async (req,res) => {
bot.getGuild(req.params.serverId).then((response) => { // It should here wait for the promise before executing res.send(...)...
res.send(response.data);
}).catch((error) => {
console.log(error) // Error: Returns that response is undefined
});
});
bot.js:
module.exports.getGuild = async function (id){
axios.get(BASE_URL + `guilds/${id}`, {
headers: {
'Authorization' : 'Bot ' + token // Send authorization header
}
}).then(function (response){ // Wait for response
console.log("Returning guild data")
return response; // Sending the response and also logging
}).catch(function (error){
console.log("Returning undefined.")
return undefined; // This is not being used in my problem
});
}
我已经知道getGuild(id)
正在返回有效的响应。返回数据时,它还会记录Returning guild data
。但是,这是在 index.js返回错误之后返回的,该错误是响应未定义。即使它实际上应该等待Promise兑现,然后再与response.data
合作。
日志:
TypeError: Cannot read property 'data' of undefined
at bot.getGuild.then (...\website\src\server\index.js:47:27)
at process._tickCallback (internal/process/next_tick.js:68:7)
Returning guild data
答案 0 :(得分:4)
then
函数中不需要 async
,因为await
是then
的语法糖。
getGuild
不会返回Axios的承诺,因此无法链接。
应该是:
module.exports.getGuild = function (id){
return axios.get(BASE_URL + `guilds/${id}`, {
...
在catch
中使用getGuild
是一个坏习惯,因为它可以抑制错误并阻止在调用方函数中对其进行处理。
答案 1 :(得分:1)
getGuild函数必须等待axios承诺才能返回结果:
try {
let res = await axios.get(BASE_URL + `guilds/${id}`, {
headers: {
'Authorization': 'Bot ' + token // Send authorization header
}
})
console.log("Returning guild data")
return res
} catch (exp) {
console.log("Returning undefined.")
return undefined;
}