AJax技术

使用反向代理(NodeJS)调试前端AJAX

字号+ 作者:H5之家 来源:H5之家 2016-04-13 14:20 我要评论( )

最近需要调式大量包含AJAX的前端代码,数据是采用的JSON格式。作为一个懒人,我不想每次都去打开VisualStudio来跑服务(VS实在太重量级了)。但是AJAX访问有跨

最近需要调式大量包含AJAX的前端代码,数据是采用的JSON格式。作为一个懒人,我不想每次都去打开VisualStudio来跑服务(VS实在太重量级了)。但是AJAX访问有跨

  最近需要调式大量包含AJAX的前端代码,数据是采用的JSON格式。作为一个懒人,,我不想每次都去打开 Visual Studio 来跑服务(VS实在太重量级了)。但是AJAX访问有跨域的问题,不能直接从本地JSON文件中去取模拟数据,所以我跑了一个NodeJS+Express来做数据模拟。


  另外,用JSON文件来模块数据还有两个问题:一是就算同一个API,不同的业务处理都有不同的返回结果,何况API还不是少数;另外,AJAX调用同一个API,根据业务处理不同,需要返回不同的结果——这是静态JSON文件做不到的。


  如果用NodeJS来模拟业务分支,返回不同的结果……虽然可以实现,但是相当于重新写了个简化版业务,太累太累……。那么,用NodeJS把获取的请求转发给开发服务器,再把开发服务器返回的结果返回到前端呢——这个办法好,标准的反向代理模型。


  然后就是去寻找NodeJS的代理组件了,找到了 node-http-proxy 和 simple-http-proxy,经过简单的试验都没让它们工作起来,可能是有地方配置错了。由于不想费神去研究这两个东东,干脆直接用NodeJS的http.request来实现。反正只是做JSON代理,而且也没有什么业务逻辑在里面。


  基本思路就是为 express 写一个路由处理模块,把所有 "/api/" 开始的 URL 都用这个路由处理器模块来处理。这个模块将收到请求的URL转换成开发服务器上的URL,再把请求的参数原样带上,然后将开发服务器上返回的结果直接返回给浏览器。


  在 app.js 中添加路由配置


app.get("/api/*", require("./routes/proxy").proxy);


  然后添加一个文件 routes/proxy.js,用来做简化版反向代理


var http = require("http"); var querystring = require("querystring"); exports.proxy = function(req, res) { // 获取 /api/ 之后的的 URL 路径 var path = req.path.replace(/^\/?api/, ""); // 获取请求参数 var contents = querystring.stringify(req.query); var options = { // TODO 配置访问参数 }; // 作为 http 客户端向服务器端发送请求 var request = http.request(options, function(response) { if (response.statusCode != 200) { // TODO 请求失败,返回错误 return; } // TODO 把 response 得到的数据通过 res 发送给浏览器 }); // 向服务器发送请求 request.write(contents); request.end(); };


  其中,根据文档,options 部分需要配置服务器主机、路径、请求方法等,直接从网上找了一段改改(嗯,一看就是抄的,因为我喜欢用双引号):


var options = { host: 'dev.my-server.com', path: path, method: 'GET', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': contents.length } };


  然后是处理开发服务器的返回结果。两种情况,正常的情况应该返回JSON数据,返回代码200;异常(比如网络异常)的情况,应该返回非200代码。


  先处理异常的情况


if (response.statusCode != 200) { res.status(response.statusCode).end(); return; }


  再处理正常的情况


response.setEncoding('UTF-8'); response.on('data', function(data) { var obj = JSON.parse(data) res.json(obj); });


  本来得到数据之后是可以直接发送给浏览器的,但是因为服务器返回出来的JSON数据是紧缩格式,人不易识别,所以干脆重新处理了下,方便调试。

本文出自 “边城客栈 学海无涯” 博客,请务必保留此出处

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • PHP教程,ASP教程,前端开发,h5cn教程,电脑教程

    PHP教程,ASP教程,前端开发,h5cn教程,电脑教程

    2016-02-09 15:01

  • javascript、jquery、AJAX总结

    javascript、jquery、AJAX总结

    2016-01-25 17:00

  • 上海前端开发课程

    上海前端开发课程

    2016-01-15 16:01

  • 前端程序员应该知道的15个jQuery小技巧

    前端程序员应该知道的15个jQuery小技巧

    2015-11-22 14:10

网友点评