2

私のアプリは、node 0.10.1、express 3.1.1、mongoose 3.6.4、mongo 2.4.1、および gridfs-stream 0.4.0 を使用しています。

次のように、共有接続を使用して mongoose と gridfs-stream をセットアップしました。

/************* app.js ***************/
//Added this in edit to show setup of mongoose and gridfs-stream
var mongoose = require("mongoose");
var Grid = require('gridfs-stream');
Grid.mongo = mongoose.mongo;
global.conn = mongoose.createConnection(dbUri);
conn.once('open', function(){
    global.gfs = Grid(conn.db);
});

gridfs-stream を使用してファイルをアップロード/ダウンロードしようとしています。私のアップロードは次のようになります。

exports.uploadFile = function(req, res){
    var file = req.files.upload;
    var docId = mongoose.Types.ObjectId(req.query.docId);
    var filename = req.query.ileName;
    var contentType = file.type;

    if(!file) return res.send({result: 'NO_FILE_UPLOADED'});

    var writestream = gfs.createWriteStream({
        _id: docId,
        filename: filename,
        mode: 'w',
        root: 'documents'
    });
 // more here but ommitted
 };

docId は、mongo ドキュメントの ObjectId から取得されます。

アップロードは機能しているようです。mongo コンソールを使用して、アップロードされたファイルを確認できます。

db.documents.files.findOne()
{
   "_id" : ObjectId("5167604d1b63f2541400003d"),
   "filename" : "borrower1.fnm",
   "contentType" : "binary/octet-stream",
   "length" : 3473,
   "chunkSize" : 262144,
   "uploadDate" : ISODate("2013-04-12T15:43:06.723Z"),
   "aliases" : null,
   "metadata" : null,
   "md5" : "04c85fe5e9ba0e798fd5eb90f1cb62be"
}

次を使用して、ファイルをダウンロードしようとすると:

exports.downloadFile = function(req, res){
    var docId = mongoose.Types.ObjectId(req.query.docId);
    var readstream = gfs.createReadStream({_id: docId});
    readstream.pipe(res);
};

次のエラーがスローされます。

Error: 5167604d1b63f2541400003d does not exist

gridfs db に格納されているように見える _id を使用して、mongo コンソールからファイルを直接取得しようとすると、null が返されます。しかし、ファイル名を使用してファイルを取得しようとすると、mongo コンソールがファイルを取得します。

関連するmongoドキュメントの_idを使用して、gridfsにアップロードされたファイルの_idを設定できませんか? もしそうなら、私のコードはどのように間違っていますか? そうでない場合、グリッドにIDを生成させ、割り当てられたIDを取得して、関連するmongoドキュメントに保存できるようにする方法はありますか?

ご協力いただきありがとうございます!

ロブ

4

3 に答える 3

5

mongoose server.js と gridfs-stream のソース コードを調べたときに答えが見つかったので、私自身の質問に答えます。

格納されたファイルの ObjectId には、関連ドキュメントの ObjectId を使用できます。

ただし、アップロードで「root」オプションを提供する場合は、ダウンロード コードでも使用するためにそれを使用する必要があります。それ以外の場合、mongoose はコレクションが基本コレクションであると想定します。

したがって、これは機能します:

exports.uploadFile = function(req, res){
    var file = req.files.upload;
    var docId = mongoose.Types.ObjectId(req.query.docId);
    var filename = req.query.ileName;
    var contentType = file.type;

    if(!file) return res.send({result: 'NO_FILE_UPLOADED'});

    var writestream = gfs.createWriteStream({
        _id: docId,
        filename: filename,
        mode: 'w',
        root: 'documents'
    });
 // more here but ommitted
 };

exports.downloadFile = function(req, res){
    var id = gfs.tryParseObjectId(req.query.docId);
    //note that options now includes 'root'
    var options = {_id: id, root: 'documents'};
    try{
        gfs.createReadStream(options).pipe(res);
    } catch(err){
        console.log(err);

    }
};
于 2013-04-15T20:02:39.190 に答える
1

gridfs-streamページを見ましたが、 mongoose ドライバーを割り当てていますか。

var conn = mongoose.createConnection(..);
conn.once('open', function () {
  var gfs = Grid(conn.db, mongoose.mongo); //missing parameter

  // all set!
})

また

Grid.mongo = mongoose.mongo;  //missing 

var conn = mongoose.createConnection(..);
conn.once('open', function () {
  var gfs = Grid(conn.db);

  // all set!
});
于 2013-04-12T18:41:41.150 に答える