You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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使用习惯的方式:

  1. 在项目根目录的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:55:18