Node.js异步读写

时间:2014-11-06 15:57:58

标签: javascript node.js asynchronous

我遇到异步文件读写操作问题。只有最后一个文件写入服务器。 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 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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

我认为你的问题可能是你正在分配&#34; fs&#34;本地,然后尝试从异步函数调用它。这可能就是为什么只有最后一个工作(也许)。 尝试将var fs = require('fs');移到代码顶部。