2013-10-18 3 views
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); 
    }); 
}; 

नेवला स्कीमा नीचे परिभाषित किया गया है है। मोंगोज़ स्कीमा में फ़ाइल का नाम और फ़ाइल स्वयं है।

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 में जोड़ा जाता है

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

जब मैं folowing कोड चलाने के लिए, मैं एक त्रुटि

एपीआई TrackDocs त्रुटि मिलता है। हालांकि, अगर मैं एक ही फाइल को फिर से अपलोड करता हूं, तो यह इसे ग्रिडएफएस में सहेजता है।

नोटिस दो trackDocs.saves हैं। मुझे यकीन नहीं है कि क्या यह समस्या या कुछ और कारण पैदा कर रहा है।

मैं नोडजेएस और मोंगोस के लिए नया हूं इसलिए किसी भी आकलन की सराहना की जाएगी।

धन्यवाद, Melroy

+0

क्या आप इसके साथ कहीं भी गए थे? – iandotkelly

+0

कौन सी लाइन उस अपवाद को फेंक रही है? एक संभावित कामकाज (वास्तविक समाधान नहीं) स्टैक आकार को बढ़ाने के लिए है। स्क्रिप्ट 'node --stack-size = 32000 app.js ' –

+0

का उपयोग करते समय आप यह कर सकते हैं आप अपनी फ़ाइल अपलोड कैसे प्रबंधित कर रहे हैं? भयानक या कुछ अन्य lib के साथ? – lukaszfiszer

उत्तर

0

सुनिश्चित नहीं हैं कि इस मदद करता है या नहीं, लेकिन यह मुझे अतीत में मदद मिली है या नहीं।

आश्चर्य की बात नहीं है कि अलग-अलग ब्राउज़रों के पास अलग-अलग कॉल स्टैक आकार होते हैं। यह भी आश्चर्य की बात नहीं है कि कॉल स्टैक निर्धारित करने के लिए वे जिस विधि का उपयोग करते हैं, वह भी भिन्न होता है। विभिन्न कॉल स्टैक आकार मैं आकलन कर सकता है कर रहे हैं (दे या ले, 1 से बंद हो सकता है या 2):

हम कुछ परीक्षण अपने आप को आदेश अन्य ब्राउज़रों/होस्ट पर कॉल स्टैक आकार प्राप्त करने के लिए भाग गया/OS के इस सरल का उपयोग करते हुए कोड:

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 उपयोग करने के लिए की जरूरत है।

संबंधित मुद्दे