为啥这个nodejs代理服务器挂了?

Posted

技术标签:

【中文标题】为啥这个nodejs代理服务器挂了?【英文标题】:Why does this nodejs proxy server hang?为什么这个nodejs代理服务器挂了? 【发布时间】:2016-02-15 07:16:27 【问题描述】:

在浏览器中,javascript 被可悲地破坏了,因为发出请求的唯一方法是使用脚本标签和 jsonp。为了使它有用,我正在尝试创建一个 nodejs 服务器,给定回调名称和地址,在地址处加载页面并将其填充到回调调用中并提供结果。但是,我对 nodejs 几乎一无所知。如果服务器的响应是从脚本标签加载的,它将导致实际加载网页。目前,我将请求写为localhost:8000/callback/address,因此脚本标签可能是<script src="localhost:8000/alert/https://www.google.com" type="text/javascript"></script>。这是我的服务器代码:

var http = require("http");
var request = require("request");
var server = http.createServer(function(req, res)
    req.on("end", function()
        console.log("alive");
        var url = req.url;
        var i = url.indexOf("/", 1);
        request(url.substring(i + 1), function(err, ret, body)
            res.writeHead(200);
            res.write(url.substring(1, i) + "(\"" + body + "\");");
            res.end();
        );
    );
);

server.listen(8000);

为什么这会加载很长时间但实际上从未加载?通过使用 console.log(),似乎 req.on("end") 回调甚至从未被调用过。

【问题讨论】:

console.log('alive)' 被打印出来了吗? 您可以尝试将日志放在req.on("end", function() 上方并发出请求吗? 服务器正在监听,那么传入的'req'不是已经结束了吗? 请注意,要使此代码正常工作,应将 body 更改为 body.replace(/[\\"\n]/g, "\\$&") 并使用 "localhost:8000/callback/address" 作为脚本地址。 【参考方案1】:

如果您不关心任何请求数据,您可以在添加 end 事件处理程序后添加 req.resume();

它“卡住”的原因是,从节点 v0.10 开始,流开始处于暂停状态,因此您需要通过某种方式读取它们来取消暂停。 req.resume(); 实现了这一点。一旦请求流中没有任何东西(可能什么都没有),就会发出end 事件。

【讨论】:

以上是关于为啥这个nodejs代理服务器挂了?的主要内容,如果未能解决你的问题,请参考以下文章

nodejs简易代理服务器

nodejs 简单的模拟代理服务器

你对用 nodejs 编写的动态代理服务器有啥想法吗

nginx 反向代理服务器是何时启动nodejs服务的

为啥NodeJs获取客户端的IP都是这样的

nginx负载均衡