2014-11-06 112 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包含最後一個文件)。創建一個接受索引作爲參數並從循環調用此函數的函數(閉包):

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 that worked! – 2014-11-07 01:54:26

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 

我認爲你的問題可能是你正在分配「FS」在本地,然後試圖從異步函數中調用它。這可能是爲什麼只有最後一個工作(也許)。 嘗試移動var fs = require('fs');到您的代碼的頂部。