PG-Promise-如何直接将二进制数据流式传输到响应

时间:2018-10-18 22:50:08

标签: pg-promise

请原谅我仍在学习。我正在尝试下载一些存储在表中的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-promise示例将数据存储在表中,如下所示:

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);
        });

但是现在我想从表中取出数据并将其下载到客户端。 docs中从二进制中提取数据的示例将其转换为JSON,然后将其打印到控制台,如下所示:

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

,并且有效。这样数据就可以从数据库出来了。但我似乎无法将其发送给客户端。看来数据已经是流了,所以我尝试了:

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

但是我遇到类型错误:第一个参数必须是字符串或Buffer

或者,我可以获取该流并将其写入文件系统,然后像上面的第一步一样使用它,但这似乎是一种解决方法。我希望有一个示例,说明如何保存到文档中的文件。

我错过了哪一步?

0 个答案:

没有答案