如何在流关闭后从async函数返回结果?下载函数返回undefined
问题原因
- 你的
async函数没有返回任何有效内容,默认会返回Promise.resolve(undefined) https.get是基于回调的异步API,回调函数里的return无法传递到外层函数的返回值中- 文件流
close事件回调里的return也无法影响外层函数的返回结果
修复后的代码
const fs = require('fs'); const https = require('https'); const path = require('path'); module.exports = async function(authToken, orderId, name, format = 'pdf'){ return new Promise((resolve, reject) => { const url = `https://reestr-api.ru/v1/order/download?auth_token=${authToken}&order_id=${orderId}&format=${format}`; https.get(url, res => { if (res.statusCode === 200) { const filename = path.join(process.cwd(), 'files', `${name}.${format}`); const file = fs.createWriteStream(filename); // 文件写入完成时返回文件名 file.on('close', () => { resolve(filename); }); // 处理文件写入错误 file.on('error', err => { reject(new Error(`文件写入失败: ${err.message}`)); }); res.pipe(file); } else { reject(new Error(`请求失败,状态码: ${res.statusCode}`)); } }) // 处理请求发起失败的情况 .on('error', err => { reject(new Error(`请求发起失败: ${err.message}`)); }); }); };
关键说明
- 用
Promise封装整个异步逻辑,让async函数能返回正确的Promise实例,调用方可以通过await或.then()获取文件名 - 通过
resolve传递成功后的文件名,reject传递各类错误信息,调用方可以用try/catch或.catch()处理异常 - 补充了请求错误和文件写入错误的处理逻辑,避免出现未捕获的异常
- 移除了原代码中无效的
return语句,所有异步操作的结果都通过Promise的状态来传递
内容的提问来源于stack exchange,提问作者La Ayze
相关产品推荐
相关产品推荐

