Node.js升级后如何将Axios响应赋值给变量?
解决Node.js v19中顶层await及异步结果外部使用问题
问题原因
你在v16中能直接使用顶层await,大概率是当时开启了CommonJS模块下的实验性顶层await特性(通过--experimental-top-level-await启动参数),或是你的文件是ES模块(.mjs后缀或package.json设置"type": "module")。而Node.js v19对CommonJS模块的顶层await限制更严格,默认不再支持实验性的顶层await,所以报错await is only valid in async functions。
另外你提供的代码里还有个明显错误:调用了不存在的getUID1(),应该是getUID()。
解决方法
方法1:改用ES模块,恢复顶层await用法
这是最贴近你v16使用习惯的方式:
- 在项目根目录的
package.json中添加一行:
"type": "module"
或者将你的JS文件后缀改为.mjs。
2. 之后就可以直接在代码顶层使用await,和v16时一样:
const clientlist = await axios.get('http://test.lab/api/getclients'); // 后续代码可直接使用clientlist变量
方法2:在CommonJS中正确处理异步结果
如果坚持使用CommonJS模块(不修改package.json或文件后缀),所有依赖异步结果的代码必须放在异步执行流程内,因为JS异步操作不会阻塞同步代码执行(你最后那个outside async的日志会先输出0,就是因为异步函数还没执行完)。
修正后的代码示例:
var uid1 = 0; async function getUID() { let res = await axios.get('http://test.lab/api/?user=test'); let data = res.data; return data; } // 把所有需要用到uid1的逻辑都放在异步IIFE内部 (async() => { console.log('before start, the value is '+ uid1); uid1 = await getUID(); // 修正函数名错误 console.log('after start, the value is '+ uid1); // 在这里编写所有依赖uid1的代码 console.log('使用uid1进行后续操作: ', uid1); })();
或者用.then()链式调用的方式:
var uid1 = 0; function getUID() { return axios.get('http://test.lab/api/?user=test') .then(res => res.data); } getUID().then(data => { uid1 = data; console.log('after start, the value is '+ uid1); // 后续依赖uid1的代码写在这里 }).catch(err => { console.error('请求失败:', err); });
关键说明
异步操作的结果不可能在同步代码中直接获取,因为异步请求需要时间完成,而同步代码会按顺序先执行。你之前在v16中能直接用,本质是ES模块或实验特性帮你处理了顶层的异步等待逻辑,不是异步结果能突破作用域直接被同步代码拿到。
内容的提问来源于stack exchange,提问作者webmaster
相关产品推荐
相关产品推荐

