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

Node.js使用await/then仍获取异步响应返回undefined问题

问题原因

输出undefined是3处写法错误共同导致的:

  • 标记了async的getData函数没有返回任何有效值:你用的https.get是Node.js传统回调风格的异步接口,你写在response.on('end')回调里的 return parseJson(str),只是把值返回给了事件监听器本身,根本没有传到getData函数的外层。getData执行到发起请求的步骤就直接跑完了,没有return任何内容,默认返回undefined,外层的then自然只能拿到undefined。
  • parseJson函数里的text变量只声明未初始化,默认值是undefined,第一次执行字符串拼接时会把undefined转成字符串拼在结果最开头。
  • 原生https模块不支持json: true这个配置项,你写的这个参数完全无效,另外代码里也没引入https模块,直接运行会报引用错误。

修复后代码

全程只用Node.js内置模块,不需要引入Axios或其他第三方库:

// 引入内置https模块
const https = require('https');

async function getData() {
  // 将回调风格的请求包装为Promise,适配async/await语法
  return new Promise((resolve, reject) => {
    let responseData = '';
    const options = {
      hostname: 'jsonplaceholder.typicode.com',
      path: '/posts/',
      method: 'GET'
    };

    https.get(options, (res) => {
      // 拼接接收的数据块
      res.on('data', (chunk) => {
        responseData += chunk;
      });

      // 数据接收完成后处理结果
      res.on('end', () => {
        const processedResult = parseJson(responseData);
        resolve(processedResult);
      });
    }).on('error', (err) => {
      // 请求出错时向外抛出错误
      reject(err);
    });
  });
}

// 这是纯同步逻辑,不需要加async修饰
function parseJson(str) {
  try {
    const postList = JSON.parse(str);
    // 初始化text为空字符串,避免出现undefined前缀
    let text = '';
    postList.forEach(item => {
      text += item.body;
    });
    return text;
  } catch (err) {
    console.error('JSON处理出错:', err);
    return '';
  }
}

// 调用测试
getData()
  .then((value) => {
    console.log('DATA: ' + value);
  })
  .catch((err) => {
    console.error('请求失败:', err);
  });

核心逻辑说明

async/await是基于Promise实现的语法糖,只要函数被标记为async,它的返回值会自动被包装成Promise:如果你没有在函数里主动return具体值或者自定义Promise,函数会在同步代码执行完后立刻返回一个fulfilled状态、值为undefined的Promise,根本不会等内部回调风格的异步操作执行完。
要在async函数里使用传统回调风格的内置API,必须手动把回调逻辑包在Promise里,在回调拿到最终结果时调用resolve把结果传递出去,出错时调用reject抛出错误,外层才能正确拿到异步执行的结果。


内容的提问来源于stack exchange,提问作者gaout5

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:36:33