现在在控制器中有段逻辑是写pdf文件,耗时约1秒多,加上此逻辑就无响应数据。 伪代码: class MyController { async logic(){ await createPdf() //这个耗时操作,注销掉就可正常返回数据. ctx.attachment(*.pdf); ctx.body={"success"}; } } @大神们,这种是否设计错误。请赐教
@atian25 具体业务是这样的,在这个logic函数中中要生成一份pdf文件,然后打成zip包,给请求的用户下载到本地。现在遇到的问题是pdf文件及zip包都正常生成,但最终要response给用户的逻辑没执行,但也没报错。 class MyController { async logic(){ await createPdf() //这个耗时操作,注销掉就可正常返回数据. ctx.attachment(由createPdf()生成的zip文件名); ctx.body=fs.createReadStream(zip文件路径); } }
@atian25 有resolve。有好多种文件导出并打包(除了pdf别的执行都时间都很短)都正常。就这个pdf出问题了。 开始运行创建PDF, 2020年12月21日 13:29:46 开始执行: 1608529589161 执行完毕: 1608529590867 创建PDF结束, 2020年12月21日 13:30:46 开始运行创建ZIP, 2020年12月21日 13:30:46 添加zip文件2: 1608529589158 写入zip成功 创建ZIP结束, 2020年12月21日 13:30:46 开始下载... 下载逻辑结束...
@atian25 下载逻辑就两行代码: ctx.attachment(fileName+".zip"); ctx.body=fs.createReadStream("zip文件绝对路径");
@chenkai0520 使用的是html-pdf pdf.create(htmlStr, { format: ‘A4’ }).toStream(function(err, stream){ stream.pipe(fs.createWriteStream(filePath)); if(err){ reject(err) }else{ console.log(‘执行完毕:’,Date.now()) resolve() } })
@nobody 从上面那段代码看出,你对 Promise 和 Stream 这块的理解需要再复习下。
// 餐厅点菜
async logic(){
stream.pipe(fs.createWriteStream(filePath)); // 服务员通知厨师做菜,厨师说:好嘞,差不多 5 分钟搞定。
resolve() // 通知后 1 毫秒立刻告诉用户:这是你的菜,做好了。(厨师:『???』
ctx.body=fs.createReadStream(zip文件路径); // 用户对着空气吃菜,收获『???』
}