使用CouchDB附件提供文件?

时间:2014-07-23 05:34:31

标签: node.js express couchdb cradle

我正在使用Express。我无法弄清楚如何将图像文件发送到客户端,以便将其显示到HTML标记<img src='/preview/?doc=xxxxxx&image=img1.jpg'>。我正在使用Cradle getAttachment函数与Couchdb https://github.com/flatiron/cradle

进行通信
db.getAttachment(id, filename, function (err, reply) {
    set('Content-Type', 'image/png');
    res.end(reply);
});

我不知道reply到底是什么以及如何将该图像传输到没有缓冲区的客户端

1 个答案:

答案 0 :(得分:5)

要将附件从底座传输到客户端而不进行缓冲,您可以 readableStream 管道到响应的 writableStream

长版

摇篮db.getAttachment的变体会返回readableStream(请参阅摇篮的文档中的streaming)。另一方面,表达'res对象充当writableStream。这意味着你应该能够*像这样管道附件:

// respond to a request like '/preview/?doc=xxxxxx&image=img1.jpg'
app.get('/preview/', function(req, res){

  // fetch query parameters from url (?doc=...&image=...)
  var id = req.query.doc
  var filename = req.query.image

  // create a readableStream from the doc's attachment
  var readStream = db.getAttachment(id, filename, function (err) { 
    // note: no second argument
    // this inner function will be executed 
    // once the stream is finished
    // or has failed
    if (err)
      return console.dir(err)
    else
      console.dir('the stream has been successfully piped')
  })
  // set the appropriate headers here
  res.setHeader("Content-Type", "image/jpeg")

  // pipe the attachment to the client's response
  readStream.pipe(res)
})

或略短:

app.get('/preview/', function(req, res){
  res.setHeader("Content-Type", "image/png")
  db.getAttachment(req.query.doc, req.query.image, someErrorHandlerFunction).pipe(res)
})

*我不在工作,很遗憾我无法验证此代码是否会运行。如果你有问题,请给我留言。