Javascript Node.js[promise ftp]-从ftp下载多个文件时无法进行数据连接(错误:connect EconRefused…)
尝试使用从Javascript Node.js[promise ftp]-从ftp下载多个文件时无法进行数据连接(错误:connect EconRefused…),javascript,node.js,download,ftp,Javascript,Node.js,Download,Ftp,尝试使用从ftp下载多个图像时出现此错误。我可以看到一些图像在此错误之前被下载 无法进行数据连接(错误:connect ECONREFUSE…) 在我的场景中,客户端发送ftp的特定目录路径,所有图像都应该从该路径下载到服务器 这是我的代码: 在空间上,uploadData由从中获取目录路径的客户端的数据组成 router.post("/addPhotos", async (req, res) => { try { let uploadData = req.body;
ftp
下载多个图像时出现此错误。我可以看到一些图像在此错误之前被下载
无法进行数据连接(错误:connect ECONREFUSE…)
在我的场景中,客户端发送ftp的特定目录路径,所有图像都应该从该路径下载到服务器
这是我的代码:
在空间上,uploadData由从中获取目录路径的客户端的数据组成
router.post("/addPhotos", async (req, res) => {
try {
let uploadData = req.body;
if (!uploadData) {
handleError("Error! Invalid data received.", res);
return;
}
await getPhotosWithCaptionsAndPath(uploadData)
.then(uDataWithCaptionsAndPath => {
uploadData = uDataWithCaptionsAndPath;
res.status(200).send({
data: "Images Uploaded successfully!",
success: true,
error: null
});
})
.catch(err => {
handleError(err, res);
});
//insert uploadData to db . . .
} catch (err) {
handleError(err, res);
}
});
getPhotosWithCaptionsAndPath = uploadData => {
return new Promise(async (resolve, reject) => {
try {
let output = [];
let fileCount = 0;
//get total # of images in all directories
await getfileCount(uploadData)
.then(fc => (fileCount = fc))
.catch(err => reject(err));
//download images and generate output array for db rows
const ftp = new PromiseFtp();
await ftp
.connect({
host: env.ftp.host,
user: env.ftp.user,
password: env.ftp.password
})
.then(serverMessage => {
//looping through each directory
uploadData.forEach(async (v, i) => {
// calc directory path
/* prettier-ignore */
let uri = `/${
v.schoolName
}/${
v.studentClass.toString()
}-${
v.studentSection
}/${
v.studentName
}`;
await ftp
.list(uri, false)
.then(list => {
//looping through each image file
list.forEach((val, index) => {
uploadFtpFile(ftp, uri, val, output)
.then(outputFromUFF => {
output = outputFromUFF;
if (fileCount === output.length) {
ftp.end();
resolve(output);
}
})
.catch(err => reject(err));
});
})
.catch(err => reject(err));
});
});
} catch (err) {
reject(err);
}
});
};
uploadFtpFile = (ftp, uri, val, output) => {
return new Promise((resolve, reject) => {
try {
ftp.get(uri + "/" + val.name).then(stream => {
let fileName = `ph${Date.now()}.png`;
let file = fs.createWriteStream("./uploads/" + fileName);
output.push({
url: fileName,
caption: val.name.replace(/\.[^/.]+$/, "")
});
stream.pipe(file);
stream.once("close", () => {
resolve(output);
});
stream.once("error", reject);
});
} catch (err) {
reject(err);
}
});
};
getfileCount = uploadData => {
return new Promise((resolve, reject) => {
try {
let fileCount = 0;
const ftpC = new PromiseFtp();
ftpC
.connect({
host: env.ftp.host,
user: env.ftp.user,
password: env.ftp.password
})
.then(serverMessage => {
uploadData.forEach(async (v, i) => {
/* prettier-ignore */
let uri = `/${
v.schoolName
}/${
v.studentClass.toString()
}-${
v.studentSection
}/${
v.studentName
}`;
await ftpC
.list(uri, false)
.then(async list => {
fileCount += list.length;
if (i === uploadData.length - 1) resolve(fileCount);
})
.catch(err => reject(err));
});
})
.catch(err => reject(err));
} catch (err) {
reject(err);
}
});
};
FTP有一个限制,因此从FTP批量上传/下载内容不是一个好主意,您需要将
foreach
循环转换为for
循环这将允许按顺序处理每个文件,这可能会延迟您的过程,但会是故障安全的
因此,您可以更改此代码段
for (let i = 0; i < list.length; i++) {
let val = list[i]
uploadFtpFile(ftp, uri, val, output)
.then(outputFromUFF => {
output = outputFromUFF;
if (fileCount === output.length) {
ftp.end();
resolve(output);
}
})
.catch(err => reject(err));
}
for(设i=0;i{
output=outputFromUFF;
if(fileCount==output.length){
ftp.end();
解析(输出);
}
})
.catch(err=>reject(err));
}