You need to enable JavaScript to run this app. Node.js FTP批量上传报连接数超限,如何实现逐文件顺序上传
优惠活动
大模型
产品
解决方案
定价
更多

Node.js FTP批量上传报连接数超限,如何实现逐文件顺序上传

报错核心原因

你的代码触发“FTP连接数量过多”错误,本质是两个逻辑漏洞导致的:

  • 遍历文件时使用同步的forEach循环,循环内触发的uploadImageToFtp是异步函数,不会等待单个文件的连接建立、上传全流程走完,就立刻触发下一次函数调用,瞬间会创建大量未释放的FTP连接,直接达到服务端的连接数阈值
  • 每个文件上传都单独新建、单独关闭FTP连接,既容易挤占连接配额,也会大幅降低批量上传的效率。
调整实现逻辑

要实现“单文件上传完成后再处理下一个”的串行上传效果,同时从根源避免连接超限,做两处核心修改:

  • 全局复用同一个FTP连接,仅在程序启动时建立一次连接,所有文件上传共用这条通道,全部流程结束后再关闭连接
  • 用支持异步等待的for...of循环替换原来的forEach遍历,确保每次循环都会等待当前文件上传的异步任务完成,再进入下一轮循环

调整后的完整可运行代码:

const ftp = require('basic-ftp')
const fs = require('fs/promises')
const path = require('path')

// 全局初始化单个FTP客户端,避免重复建连
const client = new ftp.Client()
client.ftp.verbose = true

async function runBatchUpload() {
  try {
    // 仅建立一次FTP服务连接
    await client.access({
      host: process.env.FTP_HOST,
      user: process.env.FTP_USER,
      password: '123',
      secure: false
    })

    // 读取待上传目录下的全部文件
    const uploadDir = 'plates'
    const fileList = await fs.readdir(uploadDir)

    // 串行遍历:通过await等待单个文件上传完成,再处理下一个
    for (const fileName of fileList) {
      const localPath = path.join(uploadDir, fileName)
      console.log(`开始上传:${fileName}`)
      await client.uploadFrom(localPath, path.join('tables/', fileName))
      console.log(`${fileName} 上传完成`)
    }
  } catch (err) {
    console.error('上传流程异常:', err)
  } finally {
    // 兜底关闭连接,避免无效连接残留
    client.close()
  }
}

// 启动批量上传任务
runBatchUpload()
优化效果说明
  • 全流程仅和FTP服务端建立1次连接,彻底消除多连接挤占配额导致的报错
  • 循环逻辑完全串行,不会出现并发触发多个上传任务的情况,严格遵循“上传完一个再传下一个”的处理顺序
  • 增加兜底逻辑,哪怕中途某一个文件上传失败,也能保证FTP连接正常释放,不会残留半开连接触发后续的连接数限制

内容的提问来源于stack exchange,提问作者olimih

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 03:36:04