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));
}