最近为了解决跨域问题,做了一个Node数据转发服务器,使用到了Restify和superagent。

Restify 是nodejs的模块。虽然restify的API或多或少的参考了express,但restify不是一个MVC框架,它是一套为了能够正确构建REST风格API而诞生的框架。

而superagent不用多说,熟悉nodejs的同鞋应该都知道,superagent是nodejs里一个非常方便的客户端请求代理模块。

这个服务器的任务很简单,就是接收客户端发出的请求,并根据请求向第三方服务请求数据,并将返回的数据返回给客户端,同时在服务端设置的请求头,解决了跨域问题。

下面我以请求知乎日报的数据为例,放上部分代码:

这部分我对相关的api做了一个封装:

// api.js
var request = require('superagent'); var root = 'http://news-at.zhihu.com/api/4'; var _api_base = function (req, res, next, url, success, failure) {
// 处理跨域问题
res.setHeader('Access-Control-Allow-Origin', '*');
request('GET', root + url)
.accept('json')
.end(function (err, resp) {
if (err) {
console.log('api error, HTTP CODE: ' + res.status);
return;
};
if (resp.body) {
if (success) {
success(resp.body);
} else {
// 将请求到的数据返回给客户端
res.send(resp.body);
}
} else {
if (failure) {
failure(resp.body);
} else {
console.log('error: ' + JSON.stringify(resp.body));
}
}
});
}; var Api = {
// @最新消息
getLatestNews: function (req, res, next, success) {
_api_base(req, res, next, '/news/latest');
},
// @消息内容获取与离线下载
getNewsContent: function (req, res, next) {
var id = req.params.id;
_api_base(req, res, next, '/news/' + id);
},
// @过往消息
getOldNews: function (req, res, next) {
var date = req.params.date;
_api_base(req, res, next, '/news/before/' + date);
},
// @新闻额外信息
// 输入新闻的ID,获取对应新闻的额外信息,如评论数量,所获的“赞”的数量
getNewsExtraInfo: function (req, res, next) {
var id = req.params.id;
_api_base(req, res, next, '/story-extra/' + id);
},
// @新闻对应长评论查看
getLongComments: function (req, res, next) {
var id = req.params.id;
_api_base(req, res, next, '/story/' + id + '/long-comments');
},
// @新闻对应短评论查看
getShortComments: function (req, res, next) {
var id = req.params.id;
_api_base(req, res, next, '/story/' + id + '/short-comments');
},
// @主题日报列表查看
getThemesList: function (req, res, next) {
_api_base(req, res, next, '/themes');
},
// @主题日报内容查看
getThemesContent: function (req, res, next) {
var id = req.params.id;
_api_base(req, res, next, '/theme/' + id)
},
// @热门消息
getHotNews: function (req, res, next) {
_api_base(req, res, next, '/news/hot');
}
}; module.exports = Api;

这部分便是转发服务器的具体实现:

// app.js
var restify = require('restify');
var Api = require('./api'); var server = restify.createServer();
server.get('/news/latest', Api.getLatestNews);
server.get('/news/:id', Api.getNewsContent);
server.get('/news/before/:date', Api.getOldNews);
server.get('/story-extra/:id', Api.getNewsExtraInfo);
server.get('/story/:id/long-comments', Api.getLongComments);
server.get('/story/:id/short-comments', Api.getShortComments);
server.get('/themes', Api.getThemesList);
server.get('/theme/:id', Api.getThemesContent);
server.get('/news/hot', Api.getHotNews); server.listen(8899, function () {
console.log('%s listening at %s', server.name, server.url);
});

完整项目我已经上传到了GitHub:戳这里

使用Restify+superagent做数据转发的更多相关文章

  1. node egg.js使用superagent做文件转发

    使用 egg.js + superagent 进行文件上传转发 // app/controller/file.js const Controller = require('egg').Controll ...

  2. nodejs学习之实现http数据转发

    此前在做项目的时候,一直用json文件用作模拟数据,后来发现了mock.js,于是就用了mock.js,再后来感觉这些数据再怎么模拟都是静态数据.所以就想用nodejs实现一个数据转发功能,在本地拉取 ...

  3. 使用linux系统做路由转发

    使用linux系统(PC机)做路由转发 关键字:linux,Fedora,route,iptables,ip_forward 最近做网络实验,在实验过程中需要用到linux的转发功能,但是遇到一些问题 ...

  4. Haproxy TCP数据转发

    在实际项目中需要用到haproxy做TCP转发,下面主要针对haproxy的安装及TCP数据转发配置进行说明 一.安装Haproxy (1)编译安装Haproxy mkdir -p /data01/h ...

  5. HTTP_5_通信数据转发程序:代理、网关、隧道

    HTTP通信时,除客户端和服务器之外,还有一些用于通信数据转发的应用程序,例如代理,网关,隧道.配合服务器工作. 代理 转发功能,客户端与服务器之间可有多个代理, 缓存代理:减少服务器压力,透明代理: ...

  6. koa2做请求转发

    最近用koa2做请求转发时,采用了request(options).pipe(ctx.res)的方法,结果出现了有时候前端获得的数据是分片的. 后来翻阅文档,采取了如下方式解决: const Pass ...

  7. 基于Qt实现的TCP端口数据转发服务器

    对于Qt,比较喜欢qt的sdk框架,我也是用于做一些工作中用到的工具软件,基于qt的sdk做起来也比较快: 一.概述 今天要说的这个tcp端口转发服务器,主要是用于将监听端口的数据转发到另外一个服务器 ...

  8. 手把手教你用FineBI做数据可视化

    前些日子公司引进了帆软商业智能FineBI,在接受了简单的培训后,发现这款商业智能软件用作可视分析只用一个词形容的话,那就是“轻盈灵动”!界面简洁.操作流畅,几个步骤就可以创建分析,获得想要的效果.此 ...

  9. SharedPreferences介绍,用来做数据存储

    sharedPreferences是通过xml文件来做数据存储的. 一般用来存放一些标记性的数据,一些设置信息. *********使用sharedPreferences存储数据 public sta ...

随机推荐

  1. PLECS_晶闸管调速系统_9w

    3. 直流电机开环调压调速系统模型搭建 (1)电路图 (2)仿真 当 α = pi / 2.7 的时候,直流电机的稳定转速大约保持很低的速度. 随着α的减少,直流电机的速度逐渐增大.当α = pi / ...

  2. Centos7安装GitLab

    GitLab CE Download Archives gitlab安装调试小记 Gitlab Free Trial GitLab搭建手记 Gitlab社区版的使用 GUI PNG Gitlab升级到 ...

  3. 5、flask之信号和mateclass元类

    本篇导航: flask实例化参数 信号 metaclass元类解析 一.flask实例化参数 instance_path和instance_relative_config是配合来用的:这两个参数是用来 ...

  4. springmvc log4j 配置

    web.xml 增加 <context-param> <param-name>log4jConfigLocation</param-name> <param- ...

  5. Django——ContentType及ContentType-signals的使用

    一.ContentType 在django中,有一个记录了项目中所有model元数据的表,就是ContentType,表中一条记录对应着一个存在的model,所以可以通过一个ContentType表的 ...

  6. statement preparestatement CallableStatement

    大家都知道Statement.PrepareStatement 和CallableStatement 对象,其实它们是interface,为什么JDBC2.0中要提供这三个对象呢?对于Statemen ...

  7. javascript selenium全套教程发布

    为什么有这个系列 目前javascript生态非常丰富,越来越多的人开始用js去做前端的ui测试了.而selenium是web ui测试的标准解决方案,所以一套js的selenium教程是很有必要的. ...

  8. 小技巧:selenium java中如何使用chrome默认的profile

    使用浏览器默认的profile可以在一定程度上实现免登录的效果,另外默认的profile中很多文件都被缓存了,也有利于加快测试的速度 System.setProperty("webdrive ...

  9. Nginx的gzip压缩的原理和设置参数

    开启Nginx gzip压缩非常简单,达到的效果可以压缩静态文件大小.提高页面访问速度.节省流量和带宽是很有帮助的,也为用户省去了很多流量:唯一的不足就是开启之后服务器这边会增加运算,进行压缩运算处理 ...

  10. Redis 设置开机启动

    1. 将下列代码保存为文件redis, 置于 /etc/init.d 下面 ########################### # chkconfig: 2345 90 10 redis服务必须在 ...