使用gridfs和mongoose在mongodb中存储文件

我有以下代码

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错误:RangeError:超过最大调用堆栈大小,没有添加到GridFS。 但是,如果我再次上传相同的文件,它会将其保存到GridFS中。

注意有两个trackDocs.saves。 我不确定这是否会导致问题或其他问题。

我是NodeJS和Mongoose的新手,所以任何协助将不胜感激。

谢谢,梅洛

不知道这是否有帮助,但它帮助了我过去。

毫不奇怪,不同的浏览器具有不同的调用堆栈大小。 也就不足为奇了,它们用于确定调用堆栈的方法也会有所不同。 我可以测量的各种调用堆栈大小(给出或取消,可能是1或2):

为了在其他浏览器/主机/操作系统上使用这个简单的代码获得调用堆栈大小,我们自己运行了一些testing:

 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到节点。

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

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

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