Express/Node.js中await调用getToken返回undefined的原因及解决
问题原因分析
你的代码存在两个核心问题:
- getToken函数未返回异步Promise:虽然你将getToken声明为async函数,但内部调用
fetch后没有返回这个异步操作生成的Promise对象。async函数若没有显式返回值,会默认返回一个resolve为undefined的Promise,因此await getToken()最终拿到的是undefined。 - 异步流程未被正确等待:由于getToken没返回Promise,
await无法等待内部fetch的异步操作完成,导致/getAll里的console.log(token)先执行,之后getToken内部的console.log(json)才会触发。
修复方案
以下两种规范的修复方式任选其一即可:
方式一:返回fetch的Promise链
在getToken函数的fetch调用前添加return,让函数返回整个异步流程的Promise:
async function getToken() { // 新增return,返回fetch的Promise链 return fetch("www.example.com", { method: "post", headers: { "Authorization": "Basic " + btoa(userName + ':' + password), "Accept": "application/json" } }) .then(response => response.json()) .then(json => { console.log(json) return { response_code: 200, response: json } }) .catch(err => { return { response_code: 500 } }) }
方式二:改用async/await语法替代then链
既然已经使用async函数,直接用await处理fetch的异步操作,代码可读性更强:
async function getToken() { try { const response = await fetch("www.example.com", { method: "post", headers: { "Authorization": "Basic " + btoa(userName + ':' + password), "Accept": "application/json" } }); const json = await response.json(); console.log(json); return { response_code: 200, response: json }; } catch (err) { return { response_code: 500 }; } }
两种方式都能让await getToken()正确等待异步流程完成,并拿到预期的返回值,同时保证代码执行顺序符合预期。
内容的提问来源于stack exchange,提问作者Uzair A.
相关产品推荐
相关产品推荐

