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

如何在Node.js、AngularJS、Electron中使用带认证的SOCKS代理?

在Node.js、AngularJS和Electron中使用带用户名密码的SOCKS代理发送HTTP请求

让我来帮你解决这个SOCKS代理的问题——我在Electron+Angular的项目里也遇到过类似的坑,以下是经过验证的解决方案:

一、Node.js主进程中配置SOCKS代理

首先推荐使用socks-proxy-agent这个专门的npm包,它完美支持SOCKS4/5协议,并且能处理用户名密码认证。

步骤1:安装依赖

npm install socks-proxy-agent

步骤2:基础使用示例(带认证)

原生http/https模块

const http = require('http');
const { SocksProxyAgent } = require('socks-proxy-agent');

// 构建带用户名密码的代理URL,注意特殊字符要URL编码
const proxyUrl = `socks://${encodeURIComponent('你的用户名')}:${encodeURIComponent('你的密码')}@代理主机:代理端口`;
const agent = new SocksProxyAgent(proxyUrl);

// 发送HTTP请求
http.get('http://目标服务器地址/api', { agent }, (res) => {
  let data = '';
  res.on('data', (chunk) => data += chunk);
  res.on('end', () => console.log('响应数据:', data));
}).on('error', (err) => console.error('请求出错:', err));

结合Axios使用

const axios = require('axios');
const { SocksProxyAgent } = require('socks-proxy-agent');

const proxyUrl = `socks://${encodeURIComponent('你的用户名')}:${encodeURIComponent('你的密码')}@代理主机:代理端口`;
const agent = new SocksProxyAgent(proxyUrl);

axios.get('http://目标服务器地址/api', {
  httpAgent: agent,
  httpsAgent: agent // HTTPS请求复用同一个代理
})
.then(res => console.log('响应数据:', res.data))
.catch(err => console.error('请求出错:', err));

二、Electron渲染进程(AngularJS)中使用SOCKS代理

Angular运行在Electron的渲染进程里,浏览器原生的fetch/XMLHttpRequest不支持SOCKS代理,这里有两种靠谱的方案:

方案1:通过主进程转发请求(推荐,符合Electron安全规范)

利用Electron的IPC(进程间通信),让渲染进程把请求参数发给主进程,主进程用上面的Node.js逻辑处理请求后再返回结果。

主进程代码(main.js)

const { app, BrowserWindow, ipcMain } = require('electron');
const axios = require('axios');
const { SocksProxyAgent } = require('socks-proxy-agent');
const path = require('path');

// 初始化代理Agent
const proxyUrl = `socks://${encodeURIComponent('你的用户名')}:${encodeURIComponent('你的密码')}@代理主机:代理端口`;
const agent = new SocksProxyAgent(proxyUrl);

// 监听渲染进程的请求
ipcMain.handle('fetch-via-proxy', async (event, url, options = {}) => {
  try {
    const response = await axios({
      url,
      ...options,
      httpAgent: agent,
      httpsAgent: agent
    });
    return { success: true, data: response.data, status: response.status };
  } catch (err) {
    return { success: false, error: err.message };
  }
});

// 创建窗口时配置预加载脚本
function createWindow() {
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      contextIsolation: true, // 开启上下文隔离(安全最佳实践)
      preload: path.join(__dirname, 'preload.js')
    }
  });
  mainWindow.loadFile('index.html'); // 加载你的Angular页面
}

app.whenReady().then(createWindow);

预加载脚本(preload.js)

用来安全暴露IPC方法给渲染进程:

const { contextBridge, ipcRenderer } = require('electron');

contextBridge.exposeInMainWorld('electronAPI', {
  fetchViaProxy: (url, options) => ipcRenderer.invoke('fetch-via-proxy', url, options)
});

AngularJS控制器代码

angular.module('myApp').controller('ProxyController', ['$scope', function($scope) {
  $scope.sendRequest = async () => {
    try {
      // 调用主进程的代理请求方法
      const result = await window.electronAPI.fetchViaProxy('http://目标服务器地址/api', {
        method: 'GET',
        headers: { 'Content-Type': 'application/json' }
        // 可额外传入data、params等Axios支持的参数
      });
      
      if (result.success) {
        $scope.responseData = result.data;
      } else {
        $scope.error = result.error;
      }
      $scope.$apply(); // 异步操作手动触发Angular脏检查
    } catch (err) {
      $scope.error = err.message;
      $scope.$apply();
    }
  };
}]);

方案2:渲染进程直接使用Node.js模块(仅测试/非生产环境)

如果不想用IPC,可以临时开启Node.js集成,但不推荐生产环境使用(有安全风险):

修改主进程窗口配置

const mainWindow = new BrowserWindow({
  width: 800,
  height: 600,
  webPreferences: {
    nodeIntegration: true,
    contextIsolation: false // 关闭上下文隔离
  }
});

AngularJS控制器代码

angular.module('myApp').controller('ProxyController', ['$scope', function($scope) {
  const axios = require('axios');
  const { SocksProxyAgent } = require('socks-proxy-agent');

  $scope.sendRequest = async () => {
    const proxyUrl = `socks://${encodeURIComponent('你的用户名')}:${encodeURIComponent('你的密码')}@代理主机:代理端口`;
    const agent = new SocksProxyAgent(proxyUrl);
    
    try {
      const response = await axios.get('http://目标服务器地址/api', {
        httpAgent: agent,
        httpsAgent: agent
      });
      $scope.responseData = response.data;
    } catch (err) {
      $scope.error = err.message;
    }
    $scope.$apply();
  };
}]);

三、常见问题排查

  • 确认代理服务器支持SOCKS5(如果用的是SOCKS5协议),且用户名密码完全正确
  • 检查代理主机的端口是否开放,本地能否正常连通代理服务器
  • 如果代理密码包含特殊字符,一定要用encodeURIComponent()编码后再拼入URL
  • 生产环境务必保持contextIsolation: true,避免安全漏洞

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:23:52