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

如何在Electron中通过session.setProxy()配置proxy.pac代理

问题:Electron应用配置PAC代理未生效

问题背景

现有如下proxy.pac文件,期望Electron应用加载指定serverUrl时通过该代理访问,且代理的access.log能记录对应请求:

function FindProxyForURL(url, host) {
   return 'PROXY http://{some_ip_host}:3128';
}

尝试的代码

参考相关示例编写的main.js代码:

// some imports and code before

function createWindow() {
  let loading = new BrowserWindow()

  loading.once('show', () => {
    mainWindow = new BrowserWindow({
      width: 1450,
      height: 900,
      webPreferences: {
        nodeIntegration: true,
        enableRemoteModule: true,
        contextIsolation: false,
        preload: `${__dirname}/logic.js`
      },
      show: false
    })

    let content = `function FindProxyForURL(url, host) {
      return 'PROXY http://{some_ip_host}:3128';
    }`;

    const ses = mainWindow.webContents.session;
    ses.closeAllConnections();
    ses.setProxy({
      mode:'pac_script',
      pacScript: 'data:application/x-ns-proxy-autoconfig;base64,' + Buffer.from(content, 'utf8').toString('base64')
    }).then(_=>{
      console.log('done');
    });
    // 此处期望返回PROXY,但实际仅返回DIRECT(是否正常?)
    ses.resolveProxy("https://www.google.com").then(r => {
      console.log("resolved proxy: " + r)
    }).catch(r => {
      console.log(r)
    });

    // here some code

    mainWindow.loadURL(serverUrl).then(() => {
      console.log("loaded url successfully")
    }).catch(r => {
      console.log(r)
    });
  })
}

app.whenReady().then(() => {
  createWindow()
})

错误现象

启动应用后日志输出如下,且代理无请求记录:

done
resolved proxy: DIRECT
loaded url successfully

解决方法

核心问题是异步操作的时机错误:setProxy是异步方法,你在它的回调外部直接执行resolveProxy和loadURL,此时代理配置还未生效,默认使用DIRECT连接。需将所有依赖代理的逻辑放到setProxy的完成回调内。

修改后的代码示例:

// some imports and code before

function createWindow() {
  let loading = new BrowserWindow()

  loading.once('show', () => {
    mainWindow = new BrowserWindow({
      width: 1450,
      height: 900,
      webPreferences: {
        nodeIntegration: true,
        enableRemoteModule: true,
        contextIsolation: false,
        preload: `${__dirname}/logic.js`
      },
      show: false
    })

    let content = `function FindProxyForURL(url, host) {
      return 'PROXY http://{some_ip_host}:3128';
    }`;

    const ses = mainWindow.webContents.session;
    ses.closeAllConnections();
    
    // 将代理解析、URL加载逻辑放到setProxy完成回调内
    ses.setProxy({
      mode:'pac_script',
      pacScript: 'data:application/x-ns-proxy-autoconfig;base64,' + Buffer.from(content, 'utf8').toString('base64')
    }).then(_=>{
      console.log('done');
      // 此时代理配置已生效,能正确解析代理地址
      ses.resolveProxy("https://www.google.com").then(r => {
        console.log("resolved proxy: " + r)
      }).catch(r => {
        console.log(r)
      });

      // 等待代理配置完成后再加载目标URL
      mainWindow.loadURL(serverUrl).then(() => {
        console.log("loaded url successfully")
      }).catch(r => {
        console.log(r)
      });
    });

    // here some code
  })
}

app.whenReady().then(() => {
  createWindow()
})

修改后,setProxy执行完成后才会处理代理解析和URL加载,此时PAC配置已生效,resolveProxy会返回正确的PROXY地址,代理日志也能捕获到Electron的请求记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:52:31