You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js环境下如何通过代理使用Promise风格FTP客户端?

我来帮你解决这个问题!其实promise-ftp是可以结合代理实现连接的,另外也有更省心的替代FTP客户端包,下面给你详细说明:

方案一:给promise-ftp配置代理Socket

promise-ftp底层依赖的是传统的ftp模块,而这个模块允许在连接时传入自定义的Socket对象——这就是我们实现代理的突破口。你可以用专门的代理库先建立好经过代理的Socket,再传给promise-ftp的connect方法。

示例1:通过Socks5代理连接

首先安装所需依赖:

npm install promise-ftp socks

然后编写代码:

const PromiseFtp = require('promise-ftp');
const SocksClient = require('socks').SocksClient;

async function connectWithSocksProxy() {
  const ftp = new PromiseFtp();
  
  // 先创建经过Socks5代理的Socket
  const socket = await SocksClient.createConnection({
    proxy: {
      host: '你的代理服务器地址',
      port: 1080, // Socks5默认端口
      type: 5, // 指定为Socks5类型
      // 如果代理需要用户名密码认证,取消下面注释
      // userId: '代理用户名',
      // password: '代理密码'
    },
    destination: {
      host: '你的FTP服务器地址',
      port: 21 // FTP默认端口
    }
  });

  try {
    // 使用代理Socket连接FTP服务器
    await ftp.connect({
      socket: socket,
      user: 'FTP用户名',
      password: 'FTP密码'
      // 可添加其他FTP配置,比如secure: true启用FTPS
    });

    console.log('FTP连接成功!');
    // 示例:获取目录列表
    const dirList = await ftp.list();
    console.log('目录内容:', dirList);
  } catch (err) {
    console.error('连接出错:', err);
  } finally {
    // 确保关闭连接
    if (ftp.connected) {
      await ftp.end();
    }
  }
}

connectWithSocksProxy();

示例2:通过HTTP代理连接

如果用的是HTTP代理,可以用http-proxy-agent库,步骤类似:
安装依赖:

npm install promise-ftp http-proxy-agent

代码示例:

const PromiseFtp = require('promise-ftp');
const HttpProxyAgent = require('http-proxy-agent');

async function connectWithHttpProxy() {
  const ftp = new PromiseFtp();
  
  // 创建HTTP代理Agent
  const proxyAgent = new HttpProxyAgent('http://你的代理地址:8080');
  // 若代理需要认证:'http://用户名:密码@你的代理地址:8080'

  try {
    await ftp.connect({
      host: '你的FTP服务器地址',
      port: 21,
      user: 'FTP用户名',
      password: 'FTP密码',
      agent: proxyAgent // 传入代理Agent
    });

    console.log('通过HTTP代理连接FTP成功!');
    // 执行你需要的FTP操作
  } catch (err) {
    console.error('连接出错:', err);
  } finally {
    if (ftp.connected) await ftp.end();
  }
}

connectWithHttpProxy();

方案二:使用原生支持代理+Promise的FTP客户端

如果觉得手动处理Socket有点麻烦,推荐试试basic-ftp这个包——它原生支持Promise,并且内置了对Socks4、Socks5、HTTP代理的支持,用法更简洁。

首先安装:

npm install basic-ftp

代码示例:

const ftp = require('basic-ftp');

async function connectWithProxy() {
  const client = new ftp.Client();
  client.ftp.verbose = true; // 可选,开启后会打印详细连接日志,方便排查问题

  try {
    await client.access({
      host: '你的FTP服务器地址',
      user: 'FTP用户名',
      password: 'FTP密码',
      port: 21,
      // 直接配置代理
      proxy: {
        host: '你的代理服务器地址',
        port: 1080,
        type: ftp.ProxyType.SOCKS5, // 可选值:SOCKS4、HTTP、SOCKS5
        // 代理需要认证的话添加以下配置
        // user: '代理用户名',
        // password: '代理密码'
      }
    });

    console.log('FTP连接成功!');
    // 示例:获取目录列表
    const dirList = await client.list();
    console.log('目录内容:', dirList);
  } catch (err) {
    console.error('连接出错:', err);
  } finally {
    client.close();
  }
}

connectWithProxy();

补充提示

  • 如果你使用FTP被动模式(PASV,默认模式),需要确保代理服务器支持转发FTP的被动端口;如果遇到连接问题,可以尝试切换为主动模式(PORT)。
  • promise-ftp完全兼容底层ftp模块的所有配置项,所以只要ftp模块支持的代理方式,promise-ftp都能复用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:16:51