快速响应正文缓冲
我正尝试使用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驱动程序。