2013-10-18 18 views
6

I持っているコード次保存MongoDBの使用gridfs内のファイルと

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スキーマにはファイル名とファイル自体があります。

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); 

呼び出されるサーバーコードは以下のとおりです。例外RangeError:最大コールスタック超過サイズと何がGridFSに追加され、私はfolowingコードを実行すると

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エラーを取得します。ただし、同じファイルを再度アップロードすると、GridFSに保存されます。

注意2つのtrackDocs.savesがあります。それが問題を引き起こしているのかどうかはわかりません。

私はNodeJSとMongooseを初めて使用しているので、どのようなアサーションも高く評価されます。

おかげで、 Melroy

+0

これでどこにいましたか? – iandotkelly

+0

どのラインがその例外を投げていますか? 1つの潜在的な回避策(実際の解決策ではない)は、スタックサイズを増やすことです。 'node --stack-size = 32000 app.js ' –

+0

あなたのファイルアップロードをどうやって扱いますか?恐ろしいか何か他のライブラリと? – lukaszfiszer

答えて

0

このことができますかどうか、それは、過去に私を助けているかどうかわかりません。

驚くべきことではありませんが、ブラウザーによって異なる呼び出しスタックサイズがあります。驚くことではないが、コールスタックを決定するために使用するメソッドも同様に異なります。

この単純な方法を使って他のブラウザ/ホスト/ OS上でコールスタックサイズを取得するためにいくつかのテストを自分で実行しました。コード:オプションは、ノードに--max-stack-sizeを渡すことができることを言って

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/

セットマックスV8・スタック・サイズ(バイト)

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

注:ヘルプ--max-stack-sizeとして、それを印刷し、node -vv0.10.x+であなたの代わりに--stack-sizeを使用する必要があります。

関連する問題