2015-08-27 2 views
0

Я пытаюсь создать веб-приложение для слайд-шоу, которое будет использоваться в локальной сети, поэтому время загрузки не должно быть большой проблемой.Сохранение больших данных blob в GridFS с использованием схемы Mongoose

Я использовал angular-fullstack, чтобы сгенерировать мое покрытие котла.

Я огляделся по некоторым решениям и нашел mongoose-fs, функциональность которого, похоже, является тем, что я ищу. Но я не могу заставить его работать. Я прочитал исходный код, и все это, кажется, имеет смысл.

Проблема в моем API сообщений, несмотря на то, что у req.body есть req.body.music, который содержит большой 22 МБ mp3, переменная слайда в Slide.create не обладает свойством slide.music.

Есть ли что-то, что мне не хватает или есть лучшее решение для сохранения больших файлов в GridFS?

Вот что моя схема выглядит

"use strict"; 

var mongoose = require("mongoose"); 
var mongooseFS = require("mongoose-fs"); 
var Schema = mongoose.Schema; 

var SlideSchema = new Schema({ 
    name: String, 
    info: String, 
    imgData: Buffer, 
    interval: Number 
}); 

var SlideCollection = new Schema({ 
    name: String, 
    slideshow: [SlideSchema] 
}); 

SlideCollection.plugin(mongooseFS, {keys: ["music"]}); 

module.exports = mongoose.model("Slide", SlideCollection); 

POST API мой контроллер выглядит как этот

// Creates a new slide in the DB. 
exports.create = function(req, res) { 
    Slide.create(req.body, function(err, slide) { 
     if(err) { return handleError(res, err); } 
     return res.status(201).json(slide); 
    }); 
}; 

ответ

1

Я не мог получить мангуст фс работать, но я нашел mongoose-gridstore, который основан от mongoose-fs и кажется достаточно простым (или, по крайней мере, достаточно документированным) для меня. Мне пришлось переписать свой POST API, чтобы он работал, но пока он дает мне функциональность, которую я хочу, чтобы загрузить большие mp3.

Мне также нужна более динамичная схема для обработки больших изображений, но я думаю, что ограничение на 16 Мб будет работать на данный момент.

Вот как выглядит моя схема сейчас.

"use strict"; 

var mongoose = require("mongoose"); 
var gridStore = require("mongoose-gridstore"); 
var Schema = mongoose.Schema; 

var SlideSchema = new Schema({ 
    name: String, 
    info: String, 
    imgData: String, 
    interval: Number 
}); 

var SlideCollection = new Schema({ 
    name: String, 
    slideshow: [SlideSchema] 
}); 

SlideCollection.plugin(gridStore); 

module.exports = mongoose.model("Slide", SlideCollection); 

А вот новый POST API

// Creates a new slide in the DB. 
exports.create = function(req, res) { 
    var slide = new Slide({ 
     name: req.body.name, 
     slideshow: req.body.slideshow 
    }); 

    slide.addAttachment(req.body.name, String(req.body.music)) 
     .catch(function(err) { handleError(res, err); }); 

    slide.save(function(err, post) { 
     if(err) { return handleError(res, err); } 

     return res.status(201).json(post); 
    }); 
}; 

И только ради полноты, вот GET слишком

// Get a single slide 
exports.show = function(req, res) { 
    Slide.findById(req.params.id, function (err, slide) { 
     if(err) { return handleError(res, err); } 
     if(!slide) { return res.status(404).send("Not Found"); } 
     slide.loadAttachments() 
      .then(function(doc) { 
       return res.json(doc); 
      }) 
      .catch(function(loadingErr) { 
       throw loadingErr; 
      }); 
    }); 
}; 

Тогда в Угловое мне нужно, чтобы получить response.attachements [0] .buffer для доступа к двоичным данным, чтобы делать все, что мне нужно для этого.

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