J'utilise jQuery File Upload sur express.js avec jquery-file-upload-middleware et mongoose avec mongoDB.
Je veux télécharger les images d'une galerie. L'objet Galery contient un tableau d'objets Image, tels que
var GalerySchema = new mongoose.Schema({
images: [ImageSchema]
})
Après que chaque fichier ait été téléchargé de manière asynchrone, je veux le pousser dans le tableau des images de mon objet Galery.
J'ai essayé de faire ce qui suit côté serveur :
// Is called everytime an image is uploaded
upload.on('end', function(fileInfo, rew, res){
// Get the galery
db.Galery.findOne({_id: req.fields.galery_id}, function(err, galery){
// Create new Image object instance
var image = new db.Image({src: fileInfo.name});
// Save, in order to create auto generated _id
image.save(function(err){
if(err) {console.log(err); return; }
// Add to Images array of Galery object
galery.images.push(image);
// Save galery with added image
galery.save(function(err){
if(err) { console.log(err); return; }
});
})
});
});
En faisant cela, j'obtiens un bien connu [VersionError: No matching document found.]
L'accès simultané au même document mongodb est, à ma connaissance, dû au fait que le téléchargement est asynchrone.
Donc, pour traiter le problème de manière asynchrone, il serait bon d'attendre que tous les téléchargements soient terminés, puis d'insérer les images une par une dans la base de données mongole, c'est-à-dire en utilisant la méthode suivante async.parallel()
.
Mais comment puis-je accéder à l'événement de tous les téléchargements ayant été terminés ?
Je sais que du côté du navigateur, je peux utiliser le événement d'arrêt . Mais d'abord, cela ne contient aucune donnée sur les fichiers téléchargés. De plus, je veux le faire du côté du serveur.
Y a-t-il quelque chose comme
upload.on('doneAll', function(allFilesInfo, req, res){...})?