node.js gridform + express
Posted
技术标签:
【中文标题】node.js gridform + express【英文标题】: 【发布时间】:2013-06-19 21:02:15 【问题描述】:我正在尝试将文件上传直接流式传输到 Mongo。看起来 gridform (https://github.com/aheckmann/gridform) 是一个很好的解决方案。
我已经在使用 express 框架并且喜欢它正在做的事情所以想继续使用它,但是 gridform 的使用示例似乎基于没有 express 的本机 http 服务器。
我发现 express.bodyParser() 与 gridform 冲突,所以改为:
app.use(express.bodyParser()); 我正在使用 app.use(express.json()); app.use(express.urlencoded());
让我感到困惑的部分是我现在如何在我的路线中使用 gridform。 app.post('/data/AddPropertyImage', db.addPropertyImage);
exports.addPropertyImage = function(req, res) ???
尽我所能,我似乎无法从 变种形式=网格形式(); 这个断言一直失败。 assert(form instanceof formidable.IncomingForm);
这是完整的代码段。
exports.addPropertyImage = function(req, res)
var mongo = require('mongodb')
var formidable = require('formidable');
var assert = require('assert');
var Db = require('mongodb').Db;
var Server = require('mongodb').Server;
var MongoDb = new Db('test', new Server('localhost', 27017), w: 1);
MongoDb.open(function(err, db)
var gridform = require('gridform');
gridform.db = db;
gridform.mongo = mongo;
var form = gridform();
// returns a custom IncomingForm
assert(form instanceof formidable.IncomingForm);
// this returns AssertionError: false == true
);
res.send('test');
;
编辑...
如下所述,我需要使用特定版本的强大 var formidable = require('gridform/node_modules/formidable');
断言现在通过了,但 form.parse() 似乎永远不会触发。所以 console.log('start parse');下面的线永远不会被击中。
console.log('start');
var mongo = require('mongodb')
//var formidable = require('formidable');
var formidable = require('gridform/node_modules/formidable');
var gridfsStream = require('gridform/node_modules/gridfs-stream');
console.log(gridfsStream);
var assert = require('assert');
var Db = require('mongodb').Db;
var Server = require('mongodb').Server;
var MongoDb = new Db('test', new Server('localhost', 27017), w: 1);
console.log('mongo open');
MongoDb.open(function(err, db)
var gridform = require('gridform');
gridform.db = db;
gridform.mongo = mongo;
var form = gridform();
// returns a custom IncomingForm
assert(form instanceof formidable.IncomingForm);
// this returns AssertionError: false == true
console.log('assert passed');
// optionally store per-file metadata
form.on('fileBegin', function (name, file)
console.log('mmmeta');
file.metadata = 'so meta'
)
// parse normally
form.parse(req, function (err, fields, files)
console.log('start parse');
// use files and fields as you do today
var file = files.inpFile1;
console.log(file);
file.name // the uploaded file name
file.type // file type per [mime](https://github.com/bentomas/node-mime)
file.size // uploaded file size (file length in GridFS) named "size" for compatibility
file.path // same as file.name. included for compatibility
file.lastModified // included for compatibility
// files contain additional gridfs info
file.root // the root of the files collection used in MongoDB ('fs' here means the full collection in mongo is named 'fs.files')
file.id // the ObjectId for this file
);
);
res.send('test');
【问题讨论】:
【参考方案1】:gridform
使用特定版本的formidable
(1.0.11)。如果尚未安装该特定版本(npm repo 中的最新版本是 1.0.14),它将作为特定于 gridform
模块的依赖项安装(在 ./node_modules/gridform/node_modules/
中)。
这意味着除非您使用该特定模块,否则断言将失败,因为 form
将继承自与您使用 require('formidable')
引入的模块不同的模块。
要解决这个问题,需要gridform
使用的版本:
var formidable = require('gridform/node_modules/formidable');
【讨论】:
非常感谢。我当时正用头撞墙。这确实有效,但 form.parse() 方法似乎仍然可以输入我提供的功能。我会用代码更新我的问题......再次感谢您的帮助。 @WarrickFitzGerald 删除res.send()
能解决什么问题吗?它发送回响应,而无需等待任何表单处理(异步)实际完成。
啊,是的,这确实有帮助......很多:)。所以我将 res.send() 移动到 parse() 方法的底部,并且事情“似乎”......工作。我在 Mongo 中获得了条目,但它们似乎已损坏或有问题。尝试通过 MongoVUE 打开图像会返回以下错误:打开文件时出错。无法将“MongoDB.Bson.BsonString”类型的对象转换为“MongoDB.Bson.BsonDocument”类型。
@WarrickFitzGerald 尝试使用 Node 读取文件,看看是否可行。
罗布,感谢您的帮助。还不能对此进行测试,但今晚会这样做。以上是关于node.js gridform + express的主要内容,如果未能解决你的问题,请参考以下文章