Как в 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());
});
  • Вопрос задан
  • 39 просмотров
Решения вопроса 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 либо веб сокетов

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

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

Войти через TM ID
Похожие вопросы
OneTwoTrip! Москва
от 120 000 до 200 000 руб.
D2C.io Екатеринбург
от 70 000 руб.
MobileUp Санкт-Петербург
от 100 000 руб.
17 авг. 2018, в 17:10
15000 руб./за проект
17 авг. 2018, в 16:58
60000 руб./за проект
17 авг. 2018, в 16:55
10000 руб./за проект