Как в koajs выполнить передачу файла после события 'close'?

Надо отправить файл клиенту после завершения всех операций с ним.
Вот что пытаюсь сделать:
js code
async create(ctx) {
    ctx.attachment(filename);
    ctx.set('Content-Type', mimetype);

    const arch = fs.createWriteStream(path.join(__dirname, 'someArchive.zip'));

    ctx.body = arch.on('close', () => {
      console.log('writeStream was closed');
      fs.createReadStream(file);
    });
  },
ошибка

Error: Cannot pipe, not readable
at WriteStream.Writable.pipe (_stream_writable.js:231:22)
at respond (\node_modules\koa\lib\application.js:241:43)
at handleResponse (\node_modules\koa\lib\application.js:148:34)
at


Способ заведомо неверный, но как правильно не знаю. На такой способ натолкнул пример из оф. сайта:
stream

const PassThrough = require('stream').PassThrough;

app.use(async ctx => {
ctx.body = someHTTPStream.on('error', ctx.onerror).pipe(PassThrough());
});
  • Вопрос задан
  • 165 просмотров
Решения вопроса 1
MegaBatz
@MegaBatz Автор вопроса
отвечу сам на свой вопрос))
app.use(async ctx => {
  await new Promise((resolve, reject) => {
    const stream = fs.createWriteStream(...)
    stream.on('close', () => {
      ctx.body = fs.createReadStream(...)
      resolve()
    })
  })
})

Это ответ с гитхаба. В своей личной реализации я тоже использовал Promise, но не в такой наглядной реализации. Вот такой костыль, ибо внутренней реализации у koa скорее всего нет.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@timfcsm
смотрите в сторону long polling либо веб сокетов

в вашем случае, думаю, достаточно первого варианта
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы