2013-04-12 3 views
2

Мое приложение использует узел 0.10.1, express 3.1.1, mongoose 3.6.4, mongo 2.4.1 и gridfs-stream 0.4. 0.Почему я не могу установить идентификатор на GridFS, используя идентификатор из связанного документа mongo.

Я настроил мангуст и gridfs-поток с подключением акций следующим образом:

/************* 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-потоком. Моя загрузка выглядит так:

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 исходит из 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 

Когда я пытаюсь извлечь файл непосредственно из консоли mongo с помощью _id, который, как представляется, будет храниться в db gridfs, он возвращает null. Но если я попытаюсь извлечь файл, используя имя файла, консоль mongo извлекает файл.

Может ли _id загруженного файла в gridfs не задаваться с помощью _id связанного документа о монго? Если да, то как мой код неправильный? Если нет, существует ли способ, чтобы сетка генерировала идентификатор и возвращал назначенный идентификатор, чтобы я мог хранить его в соответствующем документе mongo?

Благодарим за помощь!

Роб

ответ

5

Я собираюсь ответить на мой собственный вопрос, потому что я нашел ответ, когда происходит через исходный код Mongoose server.js и gridfs-поток.

Вы можете использовать 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); 

    } 
}; 
1

Я посмотрел на gridfs-stream странице, вы назначая драйвер мангуста к нему.

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! 
}); 
+0

Спасибо. Но нет, я добавил. Я этого не показывал. Я редактировал свой вопрос, чтобы показать, что я добавил. –

1

Вы пытались конвертировать req.query.docId в ObjectId? Если вы получаете значение из запроса, оно будет строковым, поэтому вам нужно преобразовать его в ObjectId, если этот тип _id использовался во время загрузки.

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

Seba, спасибо! Нет, я не пробовал конвертировать его, но будет. –

+0

Seba, подробнее об этом. Я изменил оба кода загрузки и загрузки, чтобы попытаться преобразовать docId в ObjectId (см. Правки выше). У меня все еще такая же проблема. Я начинаю думать, что я даже не загружаю файлы правильно. Я думаю, что я попытаюсь использовать собственный диск MongoDb, чтобы посмотреть, смогу ли я заставить его работать. Еще раз спасибо. –

Смежные вопросы