node.js - 如何发送二进制数据以响应 node.js 服务器

标签 node.js mongodb http

我是 mongodb 的新手。

我用下面的代码片段存储了二进制数据:

var data = fs.readFileSync(path);
  var image = new mongodb.Binary(data);
  //open connection/collection
var record = {picname: id, content: image   };
collection.save(record, {safe: true}, function(err,result){
  if(err)
  console.log(err.stack);
  });//save

我可以在数据库中看到记录大小。有二进制数据。记录大小也与文件大小相匹配。很开心。

现在,从 mongo 检索相同的二进制数据并尝试发送它作为响应:

var record = {picname: id};
  collection.findOne(record, function(err,result){
    if(err)
    console.log(err.stack);
    else
    {
    console.log('before read from db for download.');
    //HOW TO READ IMAGE/BINARY DATA FROM RESULT?
                                               //I need to send result in response. Any Idea?
    console.log('before read from db for download');
    }
    });

我正在使用以下代码片段发送二进制数据。它不适用于所有文件。可能是什么问题:

collection.findOne(record, function(err,result){
                if(err)
                    console.log(err.stack);
                else
                {
                    console.log('before read from db for download. result: [' + result.picname + " ], type: " + result.imagetype);
                    res.end(result.content.buffer, "binary");
                    console.log('Responded SUCCESS: ' + id );
                }
            });//findOne

请告诉我如何通过响应检索和发送。

提前致谢 DD.

最佳答案

这里的问题不在于存储和读取数据,而在于内容类型。因此,理想情况下,您希望将其与您的数据一起存储,并在发送响应时返回正确的 header 信息。

所以其中一部分是 mime 类型检测。有模块可用,mmmagic就是其中之一

var Magic = require('mmmagic').Magic;

var magic = new Magic();

var data = fs.readFileSync(path);
var image = new mongodb.Binary(data);


//open connection/collection

magic.detect(data,function(err,result) {

    var record = {picname: id, content: image, mimeType: result };

    collection.save(record, {safe: true}, function(err,result){
        if(err)
            console.log(err.stack);
    });//save

});

编写 header 的方法各不相同,但您调用的 Node 的基本“http”如下所示:

var record = {picname: id};
collection.findOne(record, function(err,result){
    if(err)
        console.log(err.stack);
    else {
        res.writeHead(200, {
            'Content-Type': result.mimeType,
            'Content-Length': result.content.length
        });
        res.write(result.content.buffer);
        res.end();
    }
});

因此,这里有效返回的是由正确的 MIME 类型标识的二进制数据。因此,您可以从一个 URL 访问它,您可以在该 URL 中提供查找文档并直接在浏览器中查看的方法,就好像它是提供的常规图像文件一样。

关于node.js - 如何发送二进制数据以响应 node.js 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25626541/

相关文章:

javascript - 循环遍历 mongodb 文档 id 数组并查询该 id 并将结果存储在新数组中给出空数组

http.ResponseWriter 不设置标题内容类型

mysql - 在 '' 中 Sequelize 未知列 'on clause'

javascript - 不知道如何消除 MongoDB 中的重复键错误

python - 使用 python 搜索句子中的术语

swift - 在 swift 3.0 中使用消费者 key 的 http 请求

javascript - 使用 Express.js 和 axios 进行 HTTP PUT

node.js - 使用 pg-promise 记录特定的 postgresql 查询

javascript - 将 Nodejs 中 MongoDB 返回的 JSON 数组中的 UTC 日期转换为本地时间的有效方法

node.js - 使用 Nodejs Sharp 模块时出错。模块解析失败 : Unexpected character '' (1: 0)