我遇到异步文件读写操作问题。只有最后一个文件写入服务器。 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);
});
})
}
});
};
答案 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');
移到代码顶部。