使用GridFS和Mongoose将文件存储在MongoDB中

6

我有以下代码

gridfs.js有以下代码,用于写入文件字节

exports.putFile = function(path, name, options, fn) {
    var db;
    db = mongoose.connection.db;
    options = parse(options);
    options.metadata.filename = name;
    return new GridStore(db, name, "w", options).open(function(err, file) {
        if (err) {
            return fn(err);
        }
        return file.writeFile(path, fn);
    });
};

以下是mongoose模式的定义。Mongoose模式具有文件名和文件本身。
var fs = require('fs');
var mongoose = require('mongoose');
var db = mongoose.connection;
var gridfs = require('./gridfs');
var Schema = mongoose.Schema;

var trackDocsSchema = mongoose.Schema(
        {
            _id : Schema.Types.ObjectId,
            docName: 'string',
            files: [ mongoose.Schema.Mixed ]
        }
);

trackDocsSchema.methods.addFile = function(file, options, fn) {
    var trackDocs;
    trackDocs = this;
    return gridfs.putFile(file.path, file.name, options, function(err, result) {
        if (err) console.log("postDocsModel TrackDocs Error: " + err);

        trackDocs.files.push(result);
        return trackDocs.save(fn);
    });
};

var TrackDocs = mongoose.model("TrackDocs", trackDocsSchema);

调用的服务器代码如下。
exports.uploadFile = function (req, res) {
    console.log("uploadFile invoked");
          var trackDocs, opts;
        trackDocs = new TrackDocs();
        trackDocs._id = mongoose.Types.ObjectId(req.body._id);
        trackDocs.docName = req.body.docName;
        opts = {
            content_type: req.files.file.type
        };

        return trackDocs.addFile(req.files.file, opts, function (err, result) {
            if (err) console.log("api TrackDocs Error: " + err);

            console.log("Result: " + result);
            trackDocs.save();
            console.log("Inserted Doc Id: " + trackDocs._id);
            return res.json(true);
        });
    };
});

当我运行以下代码时,出现错误:
api TrackDocs Error: RangeError: Maximum call stack size exceeded,而且没有将任何内容添加到GridFS。但是如果我再次上传相同的文件,它就会保存到GridFS中。
请注意,这里有两个trackDocs.saves。我不确定是否导致了此问题或其他原因。
我是NodeJS和Mongoose的新手,任何协助都将不胜感激。
谢谢, Melroy

你在这方面有什么进展了吗? - iandotkelly
哪一行引发了该异常?一个潜在的解决方法(并非真正的解决方案)是增加堆栈大小。当调用脚本 node --stack-size=32000 app.js 时,您可以这样做。 - Timothy Strimple
你是如何处理文件上传的?使用formidable还是其他库? - lukaszfiszer
你解决了你的问题吗?我需要做类似的事情,将二进制文件存储在Mongo中。 - Adam Mendoza
1个回答

0

不确定这是否有帮助,但它曾经帮助过我。

毫不奇怪,不同的浏览器具有不同的调用堆栈大小。同样不足为奇的是,它们用于确定调用堆栈的方法也各不相同。我能够测量到的各种调用堆栈大小为(可能会有1或2的偏差):

我们自己进行了一些测试,使用这个简单的代码来获取其他浏览器/主机/操作系统上的调用堆栈大小:

var i = 0;

function recurse () {
    i++;
    recurse();
}

try {
    recurse();
} catch (ex) {
    alert('i = ' + i + '\nerror: ' + ex);
}

http://javascriptrules.com/2009/06/30/limitation-on-call-stacks/

如果需要的话,可以将--max-stack-size传递给node。

设置最大v8堆栈大小(字节)

node --max-stack-size 32000 app.js

注意:node -v v0.10.x+中,帮助打印为--max-stack-size,您需要使用--stack-size


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接