2013-10-18 14 views
6

Ich habe folgenden CodeSpeicher von Dateien in mongodb mit gridfs und Mungo

gridfs.js hat den folgenden Code, die Datei Bytes

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

Das Mungo Schema unten definiert schreibt. Das Mungoschema hat einen Dateinamen und die Datei selbst.

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

Der Servercode, der aufgerufen wird, ist unten.

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

Wenn ich den Folowing Code ausführen, bekomme ich einen Fehler

api TrackDocs Fehler: Auslöser Range: Maximale Call-Stack-Größe überschritten und es wird nichts zu GridFS hinzugefügt. Wenn ich dieselbe Datei erneut hochlade, wird sie jedoch in GridFS gespeichert.

Beachten Sie, dass es zwei trackDocs.saves gibt. Ich bin mir nicht sicher, ob das das Problem verursacht oder etwas anderes.

Ich bin neu in NodeJS und Mongoose, so dass jede Hilfe sehr geschätzt wird.

Danke, Melroy

+0

Haben Sie damit überhaupt etwas erreicht? – iandotkelly

+0

Welche Zeile wirft diese Ausnahme? Eine mögliche Problemumgehung (keine echte Lösung) besteht darin, die Stapelgröße zu erhöhen. Sie können dies tun, wenn Sie das Skript 'node --stack-size = 32000 app.js ' –

+0

aufrufen. Wie gehen Sie mit Ihren Datei-Uploads um? Mit gewaltigen oder anderen Lib? – lukaszfiszer

Antwort

0

Nicht sicher, ob das hilft oder nicht, aber es hat mir in der Vergangenheit geholfen.

Es überrascht nicht, dass verschiedene Browser unterschiedliche Call-Stack-Größen haben. Es ist auch nicht überraschend, dass die Methode, die sie zur Bestimmung des Aufruf-Stacks verwenden, ebenfalls unterschiedlich ist. Die verschiedenen Call-Stack-Größen, die ich messen könnte sind: (geben oder nehmen, könnte um 1 oder 2 sein):

Wir haben einige Tests selbst durchgeführt, um die Call-Stack-Größen auf anderen Browsern/Hosts/Betriebssystemen mit dieser einfachen zu bekommen Code:

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/

sagen, dass eine Option --max-stack-size zu Knoten vorbei sein könnte.

Set max v8-Stack-Größe (Bytes)

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

HINWEIS: Hilfe druckt sie als --max-stack-size, in node -vv0.10.x+ müssen Sie --stack-size stattdessen verwenden.

Verwandte Themen