练手:nodejs请求转发
发布于 9 年前 作者 kiinlam 48312 次浏览 最后一次编辑是 8 年前 来自 分享

Github Markdown 源码

初学,拿来练手,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');

后记

如果需要对第三方服务器返回的内容做处理,可以在sreqdata事件的回调方法中进行,而不是直接使用pipe方式。

TODO

代理重定向:接收到客户端ajax请求后,重定向到第三方服务器,后续通信不再需要nodejs介入,实现nodejs server搭桥牵线功能,如果可以实现(估计已经实现),对文件上传到第三方服务器很有帮助吧。

补充

以前没搞过服务器,对请求转发、请求代理、反向代理这类东西不熟悉,如果叫法有误,烦请指正,顺便求科普下 :p


参考资料

8 回复

之前我也用 superagent 来做这个事情,但我发现,用 pipe 的话,远端传回的 cookie 没法转发出来。所以我用了 request 来实现。 https://github.com/cnodejs/nodeclub/blob/master/middlewares/proxy.js#L9

@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信息,我只能原样传给后端?应该如何做呢,请您指教

回到顶部