Pg-обещание - как передавать двоичные данные напрямую в ответ - PullRequest
0 голосов
/ 19 октября 2018

Простите, я все еще учусь.Я пытаюсь загрузить некоторые mp3-файлы, которые я храню в таблице.Я могу загружать файлы напрямую из файловой системы следующим образом:

if (fs.existsSync(filename)) {
    res.setHeader('Content-disposition', 'attachment; filename=' + filename);
    res.setHeader('Content-Type', 'application/audio/mpeg3');
    var rstream = fs.createReadStream(filename);
    rstream.pipe(res);

Я сохранил данные в таблице, используя пример pg-обещания в документах, например:

const rs = fs.createReadStream(filename);

        function receiver(_, data) {

          function source(index) {
              if (index < data.length) {
                  return data[index];
              }
          }

          function dest(index, data) {
              return this.none('INSERT INTO test_bin (utterance) VALUES($1)', data);
          }

        return this.sequence(source, {dest});
       } // end receiver func

        rep.tx(t => {
          return streamRead.call(t, rs, receiver);
        })  
        .then(data => {
            console.log('DATA:', data);
        })
        .catch(error => {
          console.log('ERROR: ', error);
        });

НоТеперь я хочу взять эти данные из таблицы и загрузить их клиенту.Пример в документации по извлечению данных из двоичного файла преобразует их в JSON, а затем выводит их на консоль следующим образом:

 db.stream(qs, s => {
          s.pipe(JSONStream.stringify()).pipe(process.stdout)
        })

, и это работает.Таким образом, данные поступают из базы данных в порядке.Но я не могу отправить его клиенту.Кажется, что данные уже являются потоком, поэтому я попытался:

  db.stream(qs, s => {
      s.pipe(res);
   });

Но я получил ошибку типа: первый аргумент должен быть строкой или буфером

В качестве альтернативы, я мог бы взять этот потоки запишите его в файловую систему, а затем обслужите его, как описано выше, но это выглядит как обходной путь.Я хотел бы, чтобы был пример того, как сохранить в файл в документах.

Какой шаг я пропускаю?

...