Node.js导出异步函数返回undefined问题求助
问题根源分析
你的代码返回undefined主要有两个核心原因:
- 外层
getName函数没有返回任何值,内部的立即执行异步函数(IIFE)的结果完全没有被外层函数捕获和返回; - 异步操作的结果无法同步获取,你需要通过
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
相关产品推荐
相关产品推荐

