2017-08-23 4 views
2

Bonjour J'essaie de télécharger plusieurs fichiers, l'écriture de fichier est correcte. mais je veux déplacer les fichiers dans mongo grid fs, le premier fichier ne se déplace que correctement le reste du fichier ne se déplacent pas dans la grille fs et ne pas dissocier aussi.Problème asynchrone lors du chargement de plusieurs fichiers

Voici mon code:

for (var i = 0; i < files.length; i++) { 
    (function(i) { 
     var singleFile = files[i]; 
     var fileData = JSON.parse(files[i].name); 
     var fileName = fileData.fileName; 
     var fileType = files[i].type; 
     var uniqId = fileData.attachmentId; 
     var targetPath = "./attachments/" + uniqId; 
     var tmp_path = files[i].path; 

    console.log("uniqId : " + uniqId); 
    //uploadFile(tmp_path,targetPath,fileName,uniqId,fileType); 

    fs.readFile(tmp_path, function(err, data) { 
     fs.writeFile(targetPath, data, function(err) { 
      if (!err) { 
       mongoose.connect(configSettings.mongodb.ip, configSettings.mongodb.databasename, configSettings.mongodb.port, function(err, succ) { 
        var id = new ObjectID(uniqId); 
        new GridStore(mongoose.connection.db, id, fileName, 'w', { 
         'content_type': 'application/octet-stream' 
        }).open(function(err, gs) { 
         gs.writeFile(targetPath, function(err) { 
          if (err) { 
           console.log("err"); 
          } 
          gs.close(function(err) { 
           console.log("success"); 
           fs.unlink("./attachments/" + uniqId, function(err) { 
            console.log("err : " + err); 
            console.log(uniqId + ' ::successfully deleted '); 
           }); 
           mongoose.connection.close(); 
          }); 
         }); 
        }); 
       }); 
      } 
     }); 
    }); 
    })(i); 
} 

    res.send("success"); 

Ce que j'ai essayé avec la fonction de fermeture, même j'ai essayé de créer la fonction séparée également, mais le même résultat vient (un seul fichier inséré et dissociées).

que dois-je faire dans ce cas pour stocker tous les fichiers dans gridfs et dissocier du dossier temporaire?

+0

est-ce que mongodb supporte toutes ces ouvertures et fermages simultanés? ne devrait-il pas être préférable d'établir d'abord la connexion à mongobd et d'ouvrir la grille, puis, dans cette fonction d'ouverture de succès, placer la boucle pour lancer tous les fichiers de traitement? – Kaddath

Répondre

1

Voici ma conjecture. Étant donné que vos appels sont reportés à plus tard, votre fonction se termine et la liste des fichiers est probablement effacé par le nœud ou autre, vous pouvez voir un exemple simplifié ici:

let myList = [1, 2, 3, 4, 5]; 
 

 
function doWork(list) { 
 
    console.log('Start of function'); 
 
    
 
    for (let i = 0; i < list.length; i++) { 
 
    (function(i) { 
 
     setTimeout(function() { 
 
     console.log('Working on index', i); 
 
     console.log('list[i] :', list[i]); 
 
     }, 100); 
 
    })(i); 
 
    } 
 

 
    console.log('End of function'); 
 
} 
 

 
doWork(myList); 
 

 
myList[4] = null;

La solution consiste à enfermer la fichier (ou la liste/index couple) lui-même pour le garder en vie dans votre contexte:

let myList = [1, 2, 3, 4, 5]; 
 

 
function doWork(list) { 
 
    console.log('Start of function'); 
 
    
 
    for (let i = 0; i < list.length; i++) { 
 
    (function(num) { 
 
     setTimeout(function() { 
 
     console.log('Num :', num); 
 
     }, 100); 
 
    })(list[i]); 
 
    } 
 

 
    console.log('End of function'); 
 
} 
 

 
doWork(myList); 
 

 
myList[4] = null;

1

En fait, le problème est avec la connexion GridFS, les fichiers téléchargent dans la boucle, la connexion au réseau est et l'écriture le premier fichier et la boucle continue parallèlement. Une fois que la connexion est active depuis le gridfs, elle doit se fermer avant d'insérer un autre fichier et doit se reconnecter correctement la prochaine fois.

Voici le code de travail Check It:

var files = req.files.fileData[0]; 
var count = ""; 

if(files instanceof Array){ 
    count = files.length; 
} 
else{ 
    count = 1; 
} 

if(!fs.existsSync('./attachments')){ 
    console.log("Creating the attachments folder."); 
    fs.mkdir('./attachments'); 
} 

function moveToGrid(gridArr,callback){  
    var uniqId = gridArr.uniqId, 
     filePath = gridArr.targetPath, 
     fileName = gridArr.fileName, 
     fileType = gridArr.fileType; 

     console.log(filePath+' '+fileName+' '+fileType + ' '+uniqId); 

    mongoose.connect(configSettings.mongodb.ip, configSettings.mongodb.databasename, configSettings.mongodb.port, function (err, succ){ 

     var uploadResponse = function(uniqId){ 
      // Delete the tmp file 
      fs.unlink("./attachments/" + uniqId, function (err) { 
       console.log(uniqId + ' ::temp file successfully deleted '); 
      }); 
      mongoose.connection.close(); 
      console.log("=========request END time==========::::" + (new Date()).toString() + "::" +(new Date()).getMilliseconds()); 
      callback(); 
     }; 
     var id = new ObjectID(uniqId); 
     new GridStore(mongoose.connection.db,id,fileName, 'w',{'content_type':'application/octet-stream'}).open(function(err, gs) { 
      gs.writeFile(filePath, function(err) { 
       if(err){ 
       console.log("err : "+err); 
       } 
       gs.close(function(err) { 
        uploadResponse(uniqId); 
       }); 
      }); 
     }); 
    }); 
} 

var recursive = function(gridArr){ 
    function uploader(i){ 
     if(i < gridArr.length){ 
     moveToGrid(gridArr[i], 
      function(){ 
       uploader(i+1) 
      }); 
     } 
     else{ 
     res.send("success"); 
     } 
    } 
    uploader(0); 
} 

if(count > 1){ 
    var gridArr = []; 
    for(var i=0; i<files.length; i++){ 
     (function(i){ 
      var singleFile = files[i]; 
       var fileData = JSON.parse(singleFile.name); 
       var fileName = fileData.fileName; 
       var fileType = singleFile.type; 
       var uniqId = fileData.attachmentId; 
       var targetPath = "./attachments/" + uniqId; 
       var tmp_path = singleFile.path; 

       fs.readFile(tmp_path,function(err,data){ 
        fs.writeFile(targetPath,data,function(err){ 
         if(!err){ 
          gridArr.push({"uniqId":uniqId, "targetPath":targetPath, "fileName":fileName, "fileType":fileType}); 
          count --; 
          if(count == 0){ 
           recursive(gridArr); 
          } 
         } 
        }); 
       }); 
     }(i));     
    } 
} 
else{ 
    var gridArr = []; 
    var singleFile = files; 
    var fileData = JSON.parse(singleFile.name); 
    var fileName = fileData.fileName; 
    var fileType = singleFile.type; 
    var uniqId = fileData.attachmentId; 
    var targetPath = "./attachments/" + uniqId; 
    var tmp_path = singleFile.path; 

    fs.readFile(tmp_path,function(err,data){ 
     fs.writeFile(targetPath,data,function(err){ 
      if(!err){ 
       gridArr.push({"uniqId":uniqId, "targetPath":targetPath, "fileName":fileName, "fileType":fileType}); 
       count --; 
       if(count == 0){ 
        recursive(gridArr); 
       } 
      } 
     }); 
    });  
} 

En utilisant ce code, nous pouvons insérer plusieurs fichiers à mongo GridFS .. Hope this helps!