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的主要内容,如果未能解决你的问题,请参考以下文章

node.js学习目录

从 node.js 服务器运行角度

node.js--express学习之路

Node.js之Express二

Express Node.js 不起作用

Node.js module.exports 不导出整个对象