2016-06-21 5 views
0

내 사용자 인터페이스 (angularjs)에서 새 행을 만듭니다. 각 행에는 파일 업로드 버튼이 있습니다. 모든 파일을 메타 데이터와 함께 업로드하고 각 행을 한 번의 호출로 저장하려고합니다. Nodejs API에 게시하는 복잡한 객체는 다음과 같습니다.Nodejs API - multer fileupload - 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" 
     } 
    ] 
} 

이 JSON은 js API에 게시됩니다. Nodejs 쪽에서 multer를 사용하여 업로드 된 파일을 서버에 저장합니다. multer의 .any() 메소드를 사용하여 API에있는 모든 파일을 가져 오지만 Steps [x] .FileUrl 속성없이 게시 된 객체를 가져옵니다.

이 파일이 추가 된 필드 이름에 대한 정보가있는 파일 개체입니다. 아래는 디버거에서 볼 수있는 정보입니다.

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 

지금 내가 게시 내 복잡한 개체 단계 [0] .FileUrl 속성을 가지고 있지 않기 때문에, 그것을 수행 할 작업을, 나는 (즉 req.files) 각 파일에 대해 반복하고 필드 이름을 사용하려면 이 속성을 만들고 originalName을 값으로 할당하십시오.

어떻게 할 노력하고 그것을

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

사람이 같은 런타임에 객체에 속성을 할당하는 방법을 알고 있나요?

답변

0

나는 이것을 다음과 같이 발견했다. [] 표기법을 변환하는 함수를 작성했다. 표기법 즉. myobj [myprop] to 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; 
} 

이렇게하면 '.'이 표시됩니다. 속성을 동적으로 생성하고 값을 설정할 수있는 표기법

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

누군가 도움이 되길 바랍니다.