【问题标题】:Node.js [promise-ftp] - Unable to make data connection (Error: connect ECONNREFUSED...) while downloading multiple files from FTPNode.js [promise-ftp] - 从 FTP 下载多个文件时无法建立数据连接(错误:连接 ECONNREFUSED ...)
【发布时间】:2019-08-22 14:07:04
【问题描述】:

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

无法建立数据连接(错误:连接 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);
    }
  });
};

【问题讨论】:

    标签: javascript node.js download ftp


    【解决方案1】:

    FTP 有一个限制,因此从 FTP 批量上传/下载内容不是一个好主意,您需要将 foreach 循环转换为 for 循环,这将允许处理每个文件按顺序,这可能会延迟您的流程,但不会发生故障。

    所以你可以改变这个sn-p

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-10
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      相关资源
      最近更新 更多