Hubot中robot.http指定代理及禁用代理相关技术问题咨询
嘿,我来帮你理清这两个问题:
1. proxy函数第二个参数的作用
你用到的proxy函数来自proxy-agent包,这个参数虽然没在Hubot文档里明确说明,但它其实是用来标记目标请求的端点是否是HTTPS协议的:
- 传
false时,对应HTTP请求:代理会直接以明文方式转发请求,不需要建立加密隧道; - 传
true时,对应HTTPS请求:代理会先发起CONNECT请求和目标服务器建立加密隧道,再通过这个隧道传输HTTPS流量,保证TLS握手能正常完成。
简单说就是让代理客户端知道该用哪种模式处理你的请求,避免HTTPS请求因为代理配置错误而失败。
2. 特定脚本中禁用全局代理的方法
Hubot文档提到的“指定Agent”操作,其实就是在单个请求里覆盖全局配置的代理Agent,改用Node.js默认的Agent。具体实现很简单,用CoffeeScript写的话是这样:
首先先引入Node.js自带的http和https模块:
http = require 'http' https = require 'https'
然后在你需要访问内部资源的脚本里,通过.agent()方法显式指定默认Agent:
module.exports = (robot) -> robot.respond /get internal info/i, (res) -> # 访问HTTP内部资源,用默认HTTP Agent robot.http('http://my-internal-service.local/api') .agent(new http.Agent()) # 这里绕开全局代理,用默认的Agent .get() (err, resp, body) -> if err res.send "访问内部资源出错啦:#{err.message}" return res.send "拿到内部数据啦:#{body}" # 如果是HTTPS的内部资源,就用默认HTTPS Agent robot.http('https://secure-internal-service.local/data') .agent(new https.Agent()) .get() (err, resp, body) -> # 这里写HTTPS请求的处理逻辑
要是觉得写new http.Agent()麻烦,也可以直接传null,这样请求会自动使用Node.js的默认Agent,同样能绕过全局代理:
robot.http('http://my-internal-service.local/api') .agent(null) .get() (err, resp, body) -> # 处理逻辑
这样就能确保这些内部资源的请求不走代理,直接访问目标服务啦。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

