官方文档提供了一个http代理的例 子。 有什么方法可以让Express使用代理?直接直接配置app.use (req, res, next) 来让所有的请求都使用代理?
require('http').createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/html"});
var auth = 'Basic ' + new Buffer("用户名:密码").toString('base64'); // 这里用户名密码请查看“扩展服务”-> “网页代理”
var options = {
host: '10.242.175.127', // 这里查看“扩展服务”-> “网页代理”中的“网页代理地址”
port: 3128,
method:"GET",
path: 'http://taobao.com/index.htm', // 这里填写你要请求的url
headers:{
"Proxy-Authorization": auth,
Host: "taobao.com" // 这里填写你要请求的目标域名
}
};
var body = "";
require("http").get(options, function(res) {
res.on('data', function(chunk) {
body += chunk.toString(); // 返回请求的内容
});
res.on('end', function() {
response.end(body); // 输出请求的内容
});
});
}).listen();
但是我使用的是Express,然后我使用了nodemailer来发送邮件。这个我如何去代理?
mailOptions =
from: userName,
to: mykarAddress,
subject: subeject,
html: content
smtpTransport.sendMail mailOptions, (err, response) ->
if err
return res.send err
console.log(response)
res.send("OK")
根据文档我在app.js里面尝试这样设置请求头,想让所有的请求都是设置了代理,但是没有成功。有什么方法让
app = express()
app.use (req, res, next) ->
req.headers["Proxy-Authorization"] = auth
req.headers.host = "proxy.ace.aliyun.com:3128"
req._parsedUrl.host = "proxy.ace.aliyun.com"
req._parsedUrl.port = 3128
req._parsedUrl.auth = auth
console.log req.headers
console.log "host =>", req.host
console.log "port =>", req.port
next()
2 回复
看文档的意思,如果你部署的Web服务器要访问外部URL,也只能通过代理访问HTTP协议的URL。发邮件,走的是SMTP协议。应该不允许的。
如果想访问外部的HTTP URL,解决办法应该是照常编写Express应用,在每个需要访问外部URL的路由处理函数中,调用http.request通过ACE的代理访问外部URL,并在回调中做相应处理。
@bnuhero 文档中有提到其他【协议https 方式(smtp/ftp 等其他协议可参考)】 我就奇怪,要是使用的是第三方的模块,那些模块的http与其他的请求是不会使用代理参数的,可以在express里面设置全局的代理吗?然后让其他的程序都是使用这个代理?