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

マングースのスキーマは以下に定義されています。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);

呼び出されるサーバー コードは次のとおりです。

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 に保存されます。

2 つの trackDocs.save があることに注意してください。それが問題を引き起こしているのか、それとも他の何かを引き起こしているのかはわかりません。

私は NodeJS と Mongoose を初めて使用するので、どんな支援も大歓迎です。

ありがとう、メルロイ

4

1 に答える 1

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 -v v0.10.x+--stack-size

于 2014-03-03T03:14:51.683 に答える