Egg中如何在一些异步操作之后返回ctx.body?

现在我这里有一个需求是,通过客户端的 node 执行一些代码,向 egg 请求执行上传静态资源压缩包,客户端本地压缩、上传,包括服务端解压缩,上传至七牛,都OK了,但是现在有一个问题是,egg 中的所有操作都是异步的,我需要在文件上传至七牛完成后,返回 body, 由客户端执行下一步操作,代码如下:

  /**
   * @description 文件上传接口
   * @param none
   * @returns none
   */
  public async index() {
    const ctx = this.ctx;
    const stream = await ctx.getFileStream();
    // 生成文件名
    const filename = path.basename(stream.filename);
    // 生成文件绝对路径
    const target = path.join(this.config.baseDir, this.UPLOAD_FILE_DIRECTORY, filename);
    // 生成一个写入文件流
    const writeStream = fs.createWriteStream(target);
    try {
      await awaitWriteStream(stream.pipe(writeStream));  // 异步写入文件
      const unzipStat = await this.unzipStatic();  // 解压缩文件夹
      if (unzipStat) {
        this.uploadStaticToQiniu(ctx);  // 上传文件至七牛
      }
    } catch (err) {
      await sendToWormhole(stream);  // 出现错误,关闭通道
      throw err;
    }

    emitter.on('uploadDone', (result: boolean) => {
      if (result) return ctx.body = {};
    });

    // ctx.body = {
    //   code: 200,
    //   message: 'upload static to QiNiu has finished!',
    //   data: null,
    // };
  }

unzipStatic 方法返回一个 promise,这步是成功的,我希望在执行 uploadStaticToQiniu 异步方法后,再发送执行结果,ctx.body = { code: 200, message: 'OK', data: null },但试过了很多方法,都不成功。

还有就是在把 ctx.body = {} 放在异步中,客户端是接收不到结果的,就会报404,请各位大佬帮忙看看怎么解决这个问题!谢谢

阅读 5.5k
1 个回答
新手上路,请多包涵

awaitWriteStream 加了await,是同步的,并不是你注释的异步。把上传七牛改成也同步就好了。eggjs里面Controller的方法是同步的,ctx.body不能放在异步方法里面。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题