2013-10-18 84 views
6

我有以下代碼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); 
    }); 
}; 

貓鼬模式定義如下。貓鼬模式有一個文件名和文件本身。

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和貓鼬,所以任何援助將不勝感激。

感謝, 梅爾羅伊

+0

你有沒有得到這個地方? – iandotkelly

+0

哪一行引發異常?一個潛在的解決方法(不是真正的解決方案)是增加堆棧大小。您可以在調用腳本'node --stack-size = 32000 app.js ' –

+0

時執行此操作如何處理文件上傳?用強大的還是其他的lib? – lukaszfiszer

回答

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到節點。

設定最高V8堆棧大小(字節)

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

注:幫助其打印爲--max-stack-size,在node -vv0.10.x+你需要使用--stack-size代替。