初学,拿来练手,nodejs代理有成熟方案:node-http-proxy,推荐使用。(据说更好的代理服务器是nginx)
问题
客户端(浏览器)通过ajax请求第三方服务器,会遇到跨域问题,可通过nodejs服务器做中介来解决跨域问题。
解决方案
客户端发起请求到nodejs服务器,nodejs收到后请求第三方服务器取得数据,返回给客户端。
client ajax --> nodejs recived --> nodejs send request --> respone to client
范例
不使用外部package的代码
var http = require('http');
// 创建http服务
var app = http.createServer(function (req, res) {
// 查询本机ip
var sreq = http.request({
host: 'sneezryworks.sinaapp.com', // 目标主机
path: '/ip.php', // 目标路径
method: req.method // 请求方式
}, function(sres){
sres.pipe(res);
sres.on('end', function(){
console.log('done');
});
});
if (/POST|PUT/i.test(req.method)) {
req.pipe(sreq);
} else {
sreq.end();
}
});
// 访问127.0.0.1:3001查看效果
app.listen(3001);
console.log('server started on 127.0.0.1:3001');
使用superAgent的代码
var http = require('http');
// 创建http服务
var app = http.createServer(function (req, res) {
// 使用了superagent来发起请求
var superagent = require('superagent');
// 查询本机ip,这里需要根据实际情况选择get还是post
var sreq = superagent.get('http://sneezryworks.sinaapp.com/ip.php');
sreq.pipe(res);
sreq.on('end', function(){
console.log('done');
});
});
// 访问127.0.0.1:3001查看效果
app.listen(3001);
console.log('server started on 127.0.0.1:3001');
使用Express + superAgent的代码
var express = require('express');
var app = express();
app.get('/', function (req, res) {
// 使用了superagent来发起请求
var superagent = require('superagent');
// 查询本机ip,这里需要根据实际情况选择get还是post
var sreq = superagent.get('http://sneezryworks.sinaapp.com/ip.php');
sreq.pipe(res);
sreq.on('end', function(){
console.log('done');
});
});
app.listen(3001);
console.log('Express started on 127.0.0.1:3001');
后记
如果需要对第三方服务器返回的内容做处理,可以在sreq
的data
事件的回调方法中进行,而不是直接使用pipe
方式。
TODO
代理重定向:接收到客户端ajax请求后,重定向到第三方服务器,后续通信不再需要nodejs介入,实现nodejs server搭桥牵线功能,如果可以实现(估计已经实现),对文件上传到第三方服务器很有帮助吧。
补充
以前没搞过服务器,对请求转发、请求代理、反向代理这类东西不熟悉,如果叫法有误,烦请指正,顺便求科普下 :p
参考资料
之前我也用 superagent 来做这个事情,但我发现,用 pipe 的话,远端传回的 cookie 没法转发出来。所以我用了 request 来实现。 https://github.com/cnodejs/nodeclub/blob/master/middlewares/proxy.js#L9
mark
学习
@alsotang 大哥,他这为什么把headers里的 cookie,referer去掉了 https://github.com/cnodejs/nodeclub/blob/master/middlewares/proxy.js#L21
@luckymore 忘了。可能为了安全性吧。我把自己网站的cookie带带其他网站,肯定没必要的。
@alsotang 我现在的需求是,做中间层,处理数据格式。我得把cookie和头信息,原样带给我们的java后端才能拿到response
@luckymore 后端跟你转发层之间的鉴权不应该通过cookie的
@alsotang 可是后端需要前端的cookie信息,我只能原样传给后端?应该如何做呢,请您指教