私のアプリは、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ドキュメントに保存できるようにする方法はありますか?
ご協力いただきありがとうございます!
ロブ