2015-08-27 1 views
0

Je tente de créer une application Web de diaporama qui sera utilisée sur un réseau local, de sorte que les temps de chargement ne devraient pas poser de gros problèmes.Enregistrement de données BLOB volumineuses dans GridFS à l'aide du schéma Mongoose

J'ai utilisé angular-fullstack pour générer mon placage de chaudière. J'ai regardé autour de certaines solutions et trouvé mongoose-fs, quelle fonctionnalité semble être ce que je cherche. Mais je n'arrive pas à le faire fonctionner. J'ai lu le code source et tout semble logique.

Le problème est dans mon API de publication, malgré le fait que req.body a req.body.music qui contient un grand 22MB mp3, la variable de diapositive dans le Slide.create n'a pas de propriété slide.music.

Y at-il quelque chose qui me manque ou existe-t-il une meilleure solution pour enregistrer des fichiers volumineux dans GridFS?

Voici ce que mon schéma ressemble

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

Mon contrôleur de l'API POST ressemble à ce

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

Répondre

1

Je ne pouvais pas travailler mangouste-fs, mais je l'ai trouvé mongoose-gridstore qui est basé de mongoose-fs et semble être assez simple (ou au moins bien documenté) pour que je puisse l'utiliser. J'ai dû réécrire mon API POST pour le faire fonctionner, mais jusqu'à présent, il me donne la fonctionnalité que je veux, qui est de télécharger de gros fichiers mp3. Je voudrais également un schéma plus dynamique pour gérer le téléchargement de grandes images, mais je pense que la limitation de 16 Mo serait réalisable pour le moment.

Voici à quoi ressemble mon schéma.

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

Et voici la nouvelle API POST

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

Et pour être complet, voici l'EEG trop

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

Puis, dans angulaire je dois obtenir les response.attachements [0] .buffer pour accéder aux données binaires pour faire tout ce que j'ai besoin de faire avec.