现在我这里有一个需求是,通过客户端的 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,请各位大佬帮忙看看怎么解决这个问题!谢谢
awaitWriteStream 加了await,是同步的,并不是你注释的异步。把上传七牛改成也同步就好了。eggjs里面Controller的方法是同步的,ctx.body不能放在异步方法里面。