2016-06-21 1 views
0

Dans mon interface utilisateur (angularjs), je crée une nouvelle ligne. Chaque rangée a un bouton de téléchargement de fichier. Je veux télécharger tous les fichiers avec les métadonnées et enregistrer chaque ligne en un seul appel. L'objet complexe que je posterai à l'API NodeJS est un peu comme ci-dessousAPI Nodejs - multer fileupload - Ajout dynamique de la propriété et de sa valeur à l'objet JSON

var activity = { 
    "Id" : 1, 
    "Name" : "Test", 
    "Steps" : [ 
    { 
     "StepId":1, 
     "FileUrl": {fileObject} // this property if bound with the file upload directive 'ng-file-upload' by Daniel Farid 
     "Description" : "Save this file" 
     }, 
    { 
     "StepId":2, 
     "FileUrl": {fileObject} // this property if bound with the file upload directive 'ng-file-upload' by Daniel Farid 
     "Description" : "Save this file2" 
     } 
    ] 
} 

Ce JSON sera affiché à l'API de nœud. Du côté Nodejs, j'utilise multer pour enregistrer les fichiers téléchargés sur le serveur. Je reçois tous les fichiers dans l'API en utilisant la méthode .any() de multer, mais j'obtiens l'objet posté sans la propriété Steps [x] .FileUrl.

L'objet fichier qui contient les informations sur le nom du champ dans lequel ce fichier a été ajouté. Ci-dessous l'information que je vois dans le débogueur.

Array[2] 
length:2 
[0]:Object 
destination:"C:\DeleteThis\" 
encoding:"7bit" 
fieldname:"Steps[0][FileUrl]" 
filename:"ed13d2a61cb38c43f1f46a221855a896" 
mimetype:"image/png" 
originalname:"deploy.png" 
path:"C:\DeleteThis\ed13d2a61cb38c43f1f46a221855a896" 
size:2347 
[1]:Object 

Maintenant ce que je veux faire, puisque mon objet complexe qui est affiché n'a pas d'étapes [0] propriété .FileUrl, je veux itérer pour chaque fichier (c.-à-req.files) et utiliser nomchamp à Créez cette propriété et attribuez-lui la valeur originale.

Comment je suis en train de le faire

var deployment = req.body; 
     if(req.files){ 
      var app = _config.getApplicationConfig(req.body.ApplicationId); 
      req.files.forEach(function(f){ 

       //Move file to the deployment folder. 
       _utils.createDirIfNotExist(app.packageDir); 
       var newPath = _utils.DetermineFileName(f.originalname, app.packageDir); 
       _fs.renameSync(f.path, path.join(app.packageDir,newPath)); 
       var newFileName = path.basename(newPath); 
       //set the file url to corresponding field 
       var evalExp = "deployment." + f.fieldname; //I get evalExpression as "deployment.Steps[0][FileUrl]" 
       eval(evalExp); //Here it fails saying FileUrl is not defined 
       evalExp = "deployment." + f.fieldname + "= \"" + newFileName.toString() + "\""; 
       eval(evalExp);  
      }); 
     } 

Est-ce que quelqu'un sait comment peut en attribuer la propriété à un objet au moment de l'exécution?

Répondre

0

J'ai trouvé une solution à ceci comme ci-dessous J'ai écrit une fonction qui convertit la notation [] en. notation ie. myobj [myprop] pour myobj.myprop

var convertToDotNotation = function (keyPath) { 
    var bracketSyntaxRegex = new RegExp(/\[([^0-9])\w+\]/g); //matches the javascript property defined in [] syntax but not an array 
    var matches = keyPath.match(bracketSyntaxRegex) 
    if(matches && matches.length > 0){ 
     matches.forEach(function(p){ 
      //replace '[' with '.' and ']' with emptyspace 
      var dotSyntax = p.replace("[",".").replace("]",""); 
      keyPath = keyPath.replace(p,dotSyntax); 
     }); 
    } 
    return keyPath; 
} 

Cela me donnera le '' notation qui peut dynamiquement créer la propriété et définir la valeur

var newFileName = "MyFile.pdf"; 
var evalExp = "deployment[0].[FileUrl]" ; 
var temp = convertToDotNotation(evalExp); 
eval(temp + "= \"" + newFileName + "\""); 

Espérons que cela aide quelqu'un.