快速响应正文缓冲

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

GridFS获取需要一个Buffer对象NodeJS Mongo Driver GridFS

这个问题很简单:我如何将接收到的请求正文转换成适当的缓冲区。

我的代码到目前为止(只有重要的部分):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'); 

创build缓冲区,但它有一个错误的大小,可能不正确的内容,因为util.inspect显然是不正确的路要走。

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

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

缓冲区长度= 0

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

谢谢!

首先,请记住,Express是构build在Connect之上的, Connect是处理大量较低级HTTP工作的库,它是bodyParser()来源。

身体分析器中间件内部使用Formidable来parsingfile upload。

Formidable的默认行为是将上传的文件直接写入磁盘 – 换句话说,您实际上不能访问路由处理程序中上传的文件stream。 你可以获得在req.body发送的任何常规表单字段( <input> )的req.body ,并且通过req.files获取上传的文件path,但是不会获得文件内容。

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

如果您想直接将文件数据stream式传输到Mongo,那么在您面前就有更多的挑战。 你将不得不编写自己的中间件来parsing上传stream。

这实际上比较容易。 您可以从内部的Connect body parser实现开始,使用Formidable来完成繁重的工作,然后使用onPart API将stream传递回路由处理程序,以便将其传递给Mongo驱动程序。