快速响应体缓冲

时间:2012-07-22 02:53:37

标签: node.js mongodb express connect gridfs

我正在尝试使用Node构建一个快速简单的图像上传服务,它接收所接收的图像并将它们保存到Mongo的GridFS。

GridFS get需要一个Buffer对象NodeJS Mongo Driver GridFS put

问题很简单:如何将接收到的请求主体完全转换/转换为适当的缓冲区。

到目前为止我的代码(只有重要部分): api.js

var express = require('express');
var connect = require('connect');

var app = module.exports = express.createServer();

app.configure(function(){
  app.use(express.bodyParser()); 
  app.use(express.methodOverride());
  app.use(app.router);
});

var upload = require('./upload.js');
app.post('/upload', upload.upload);

upload.js

exports.upload = (function(req, res, next){
  console.log("Uploading image...");
  // Create buffer
  // Rest of the code
}

我试过了:

  var buffer = new Buffer(util.inspect(req.body),'binary');

创建缓冲区,但它的大小错误,可能不是正确的内容,因为util.inspect显然不是正确的方法。

和:       var buffer = new Buffer(req.body); 结果:

 [Decode error - output not utf-8][Decode error - output not utf-8]

缓冲区长度= 0

我对Node和JavaScript的开发都很陌生,所以可能我错过了一些非常简单的东西,不要犹豫,指出明显的事情:)

谢谢!

1 个答案:

答案 0 :(得分:4)

首先,请记住Express是建立在Connect之上的,internally是处理大量低级HTTP工作的库,而bodyParser()来自哪里。

正文解析器中间件Formidable使用API来解析文件上传。

Formidable的默认行为是将上传的文件直接写入磁盘 - 换句话说,您实际上无法访问路由处理程序中的上传文件流。您可以获得<input>中发送的任何常规表单字段(req.body)的值,并通过req.files获取上传的文件路径,但是您没有获得文件内容。

简单回答这里只是简单地从磁盘读取文件并使用它保存到Mongo中,记住在完成后删除临时文件。当然,这引入了将文件上载写入临时文件夹然后加载到Mongo的不必要的中间步骤。

如果您想直接将文件数据流式传输到Mongo,那么您面临的挑战就更多了。您必须编写自己的中间件来解析上传流。

这实际上相对很容易。您可以从内部Connect body解析器实现开始 - 使用Formidable来执行繁重的工作 - 并使用onPart {{3}}将流传递回路由处理程序,以便您可以将其传递给Mongo司机。