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
相关产品推荐
相关产品推荐

