gpt4 book ai didi

javascript - Node.js [promise-ftp] - 从 FTP 下载多个文件时无法建立数据连接(错误 : connect ECONNREFUSED. ..)

转载 作者:行者123 更新时间:2023-11-30 19:19:43 26 4
gpt4 key购买 nike

我在尝试使用 promise-ftpftp 下载多个图像时遇到此错误.在出现此错误之前,我可以看到正在下载一些图像。

Unable to make data connection( Error: connect ECONNREFUSED...)

在我的场景中,客户端发送 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));
}

关于javascript - Node.js [promise-ftp] - 从 FTP 下载多个文件时无法建立数据连接(错误 : connect ECONNREFUSED. ..),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57611240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com