2013-10-18 20 views
6

ben kod aşağıdakidepolanması mongodb kullanarak gridfs dosyalar ve

gridfs.js mongoose firavunfaresi şema aşağıda tanımlanmıştır

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

dosya bayt yazar aşağıdaki kodu vardır. Mongoose şemasının bir dosya adı ve dosyanın kendisi vardır.

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

Çağrılan sunucu kodu aşağıda. RangeError: Maksimum çağrı yığını aşıldı boyut ve hiçbir şey GridFS eklenir ben folowing kodu çalıştırdığınızda

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

, bir hatayı

api TrackDocs Hata olsun. Ancak, aynı dosyayı tekrar yüklerseniz, bunu GridFS'ye kaydeder.

İki trackDocs.saves olduğuna dikkat edin. Soruna veya başka bir şeye neden olup olmadığından emin değilim.

NodeJS ve Mongoose'da yeniyim, bu sayede herhangi bir destek çok takdir edilecek.

sayesinde Melroy

+0

Bunun ile herhangi bir yer buldunuz mu? – iandotkelly

+0

Bu istisna hangi satırı veriyor? Bir potansiyel geçici çözüm (gerçek çözüm değil) yığın boyutunu artırmaktır. Betiği çağırırken bunu yapabilirsiniz 'node --stack-size = 32000 app.js ' –

+0

Dosya yükleme işlemlerini nasıl yapıyorsunuz? Zorlu veya başka bir lib ile? – lukaszfiszer

cevap

0

bu yardımcı olur ya da değil, ama geçmişte bana yardımcı olup olmadığını emin değilim.

Şaşırtıcı olmayan şekilde, farklı tarayıcılarda farklı çağrı yığını boyutları vardır. Ayrıca şaşırtıcı bir şekilde, çağrı kümesini belirlemek için kullandıkları yöntem de değişir. Ölçebildiğim çeşitli çağrı yığını boyutları (ver veya al, 1 veya 2 tarafından kapalı olabilir):

Bu basit kullanarak, diğer tarayıcılarda/ana makineler/işletim sistemlerinde çağrı yığını boyutlarını almak için bazı testler yürüttük. kod:

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/

bir seçenek düğüme --max-stack-size geçen olabileceğini söyleyerek.

Seti maksimum v8 yığın boyutu (bayt)

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

NOT: node -vv0.10.x+ içinde --max-stack-size gibi Yardım baskılar, bunun yerine --stack-size kullanmak gerekir.