为啥这个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代理服务器挂了?的主要内容,如果未能解决你的问题,请参考以下文章