2014-11-06 4 views
-1

У меня возникла проблема с асинхронными процессами чтения и записи файлов. на сервер записывается только последний файл. ЯШ: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 содержит последний файл). Создайте функцию (замыкание), которая принимает индекс как параметр и вызывается этой функцией из цикла:

function blah(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); 
      }); 
     }) 
} 
for(i=0;i<filelength;i++) blah(i); 
+0

thankyou akonsu, который сработал! –

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

С структурой каталогов, как:

script.js 
text.txt 
public 
    assignments 

Я думаю, ваша проблема может быть, что вы назначаете «фс» локально, а затем пытаются вызовите его из асинхронной функции. Возможно, поэтому работает только последний (возможно.) Попробуйте переместить var fs = require('fs'); в начало вашего кода.

Смежные вопросы