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

Node.js导出异步函数返回undefined问题求助

问题根源分析

你的代码返回undefined主要有两个核心原因:

  1. 外层getName函数没有返回任何值,内部的立即执行异步函数(IIFE)的结果完全没有被外层函数捕获和返回;
  2. 异步操作的结果无法同步获取,你需要通过Promise的链式调用或async/await语法来等待异步操作完成。

修复方案

第一步:修改MYCODE.JS,让函数本身成为异步函数

把内部的IIFE去掉,直接让getName成为async函数,这样它会自动返回一个包含结果的Promise:

// 别忘了引入axios,原代码里遗漏了这一步
const axios = require('axios');

async function getName() {
  try {
    // 注意:URL必须加上http/https协议,否则axios会请求失败
    let response = await axios.get('https://www.API-EXAMPLE.com');
    
    console.log("You've requested a number with the following ID: " + response.data.slice(14, 22));
    console.log("You've requested a number with the following NUMBER: " + response.data.slice(-11));
    
    const number = response.data.slice(-11);
    return number; // 这里返回的会被包装成Promise
  } catch (err) {
    // 处理API请求失败的情况,避免程序崩溃
    console.error('Failed to fetch data:', err);
    throw err; // 将错误抛出,让调用方可以捕获处理
  }
}

exports.getName = getName;

第二步:修改MYAPP.JS,正确处理异步返回值

因为getName现在返回的是Promise,你需要用以下两种方式之一获取结果:

方式1:使用async/await(更直观)

const { getName } = require('./requestnumber.js');

// 把setTimeout的回调改成async函数
setTimeout(async () => {
  try {
    const number = await getName();
    console.log(number); // 这里会输出你想要的MYNUMBER
  } catch (err) {
    console.error('Error getting number:', err);
  }
}, 5000);

方式2:使用Promise.then()(传统链式调用)

const { getName } = require('./requestnumber.js');

setTimeout(() => {
  getName()
    .then(number => {
      console.log(number); // 输出MYNUMBER
    })
    .catch(err => {
      console.error('Error getting number:', err);
    });
}, 5000);

为什么原来的代码不行?
  • 你的原getName函数没有任何return语句,所以默认返回undefined;
  • 内部的IIFE是一个独立的异步操作,它的返回值没有被外层函数接收,外层函数根本不知道这个异步操作的结果;
  • 异步操作的结果不能同步获取,必须等待异步任务完成后,通过Promise的机制来获取结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:57:40