koajs: как дождаться, пока клиент получит файл?

#javascript #node.js #koa #koa2

#javascript #node.js #koa #koa2

Вопрос:

Я хочу вернуть сгенерированный файл с помощью koa (2), и после того, как клиент закончил получать файл, файл должен быть удален.

 // this function is called by Koa
async myMethod (ctx) {
  const file = await something()// generate a file

  ctx.attachment(path.basename(file))
  ctx.body = fs.createReadStream(file)

  // how can I await here for the client to fully receive file?

  await fs.promises.unlink(file)
}
 

Я мог бы сделать это:

 ctx.body.on('end', async () => { 
  console.log('client finished receiving') 
  await fs.promises.unlink(file)
})
 

но я бы предпочел поместить логику удаления в отдельное промежуточное программное обеспечение,
и поэтому мне нужно дождаться полной отправки файла, прежде чем возвращаться из функции

Комментарии:

1. Может быть, что-то вроде await new Promise(resolve => { ctx.body.on('end', resolve) }) ?

2. @ChrisG Я уже пробовал это, но почему-то обещание никогда не разрешается таким образом и зависает навсегда. Только когда я также регистрирую eventlistener для ‘data’ в обещании, оно разрешается, но тогда файл-данные не попадают в ctx.body.