Node.js异步读取和写入

问题描述:

我遇到了异步文件读写操作的问题。只有最后一个文件被写入服务器。 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); 
       }); 
      }) 
     } 
    }); 
}; 

这是一个通过使用循环变量而没有闭包导致的常见错误。在调用读取操作的回调时,循环已终止,索引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

这还不是很一个答案,但它是一个评论太长。 什么不起作用?该文件读取/你的代码的编写位工作正常:

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');到您的代码的顶部。