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
相关产品推荐
相关产品推荐

