2014-11-06 2 views
-1

비동기 파일 읽기 및 쓰기 조작에 문제가 있습니다. 마지막 파일 만 서버에 기록됩니다. JS :Node.js 비동기 읽기 및 쓰기

function uploadassignment(req, res){ 
    var path; 
    var multiparty = require("multiparty"); 
    var form = new multiparty.Form(); 
    console.log(req.query); 
    var filelength = req.query.filecount; 
    console.log(filelength); 
    form.parse(req, function(err, fields, files){ 
    console.log(req.body); 
     for(i=0;i<filelength;i++){ 
      var img = files.file[i]; 
      console.log(img); 
      console.log('divide'); 
      var fs = require('fs'); 
      fs.readFile(img.path, function(err, data){ 
       var originalfile = img.originalFilename.split('.'); 
       console.log(originalfile); 
       var file_ext = originalfile[1]; 
       path = "public/assignments/"+img.originalFilename; 
       console.log(path); 
       fs.writeFile(path, data, function(error){ 
        if(error)console.log(error); 
       }); 
      }) 
     } 
    }); 
}; 

답변

2

이것은 닫히지 않고 루프 변수를 사용함으로써 발생하는 일반적인 버그입니다. 읽기 작업에 대한 콜백이 호출 될 때까지 루프가 종료되고 인덱스 i이 마지막 요소를 가리 킵니다 (따라서 img에 마지막 파일이 포함됨). 인덱스를 매개 변수로 허용하는 함수 (클로저)를 만들고 루프에서이 함수를 호출하십시오.

+0

감사합니다. –

0

이 꽤 대답은 아니지만, 코멘트 너무 깁니다. 작동하지 않는 기능은 무엇입니까? 파일 읽기/코드의 작성 비트가 잘 작동 : 같은 디렉토리 구조와

var fs = require("fs") 

img = { 
    path: "./test.txt", 
    originalFilename: "test.txt" 
} 

fs.readFile(img.path, function(err, data){ 
    if(err)console.log(err); 
    var originalfile = img.originalFilename.split('.'); 
    console.log(originalfile); 
    var file_ext = originalfile[1]; 
    path = "public/assignments/"+img.originalFilename; 
    console.log(path); 
    fs.writeFile(path, data, function(error){ 
     if(error)console.log(error); 
    }); 
}) 

: 나는 당신의 문제가 로컬 "FS"를 할당되어있을 것 같아요

script.js 
text.txt 
public 
    assignments 

에 노력 비동기 함수에서 호출하십시오. 그게 마지막 코드가 작동하는 이유 일 수도 있습니다. var fs = require('fs'); 코드 위로 이동하십시오.