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

如何在流关闭后从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:30:47