使用Restify+superagent做数据转发
最近为了解决跨域问题,做了一个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做数据转发的更多相关文章
- node egg.js使用superagent做文件转发
使用 egg.js + superagent 进行文件上传转发 // app/controller/file.js const Controller = require('egg').Controll ...
- nodejs学习之实现http数据转发
此前在做项目的时候,一直用json文件用作模拟数据,后来发现了mock.js,于是就用了mock.js,再后来感觉这些数据再怎么模拟都是静态数据.所以就想用nodejs实现一个数据转发功能,在本地拉取 ...
- 使用linux系统做路由转发
使用linux系统(PC机)做路由转发 关键字:linux,Fedora,route,iptables,ip_forward 最近做网络实验,在实验过程中需要用到linux的转发功能,但是遇到一些问题 ...
- Haproxy TCP数据转发
在实际项目中需要用到haproxy做TCP转发,下面主要针对haproxy的安装及TCP数据转发配置进行说明 一.安装Haproxy (1)编译安装Haproxy mkdir -p /data01/h ...
- HTTP_5_通信数据转发程序:代理、网关、隧道
HTTP通信时,除客户端和服务器之外,还有一些用于通信数据转发的应用程序,例如代理,网关,隧道.配合服务器工作. 代理 转发功能,客户端与服务器之间可有多个代理, 缓存代理:减少服务器压力,透明代理: ...
- koa2做请求转发
最近用koa2做请求转发时,采用了request(options).pipe(ctx.res)的方法,结果出现了有时候前端获得的数据是分片的. 后来翻阅文档,采取了如下方式解决: const Pass ...
- 基于Qt实现的TCP端口数据转发服务器
对于Qt,比较喜欢qt的sdk框架,我也是用于做一些工作中用到的工具软件,基于qt的sdk做起来也比较快: 一.概述 今天要说的这个tcp端口转发服务器,主要是用于将监听端口的数据转发到另外一个服务器 ...
- 手把手教你用FineBI做数据可视化
前些日子公司引进了帆软商业智能FineBI,在接受了简单的培训后,发现这款商业智能软件用作可视分析只用一个词形容的话,那就是“轻盈灵动”!界面简洁.操作流畅,几个步骤就可以创建分析,获得想要的效果.此 ...
- SharedPreferences介绍,用来做数据存储
sharedPreferences是通过xml文件来做数据存储的. 一般用来存放一些标记性的数据,一些设置信息. *********使用sharedPreferences存储数据 public sta ...
随机推荐
- LeetCode - 492. Construct the Rectangle
For a web developer, it is very important to know how to design a web page's size. So, given a speci ...
- install atom markdown preview plus error
Installing "markdown-preview-enhanced@0.15.2" failed.Hide output- npm ERR! Darwin 17.2.0 n ...
- PHP die与exit的区别
最近听见有人说die和exit区别,bula~bula.决心一探究竟. 翻了翻PHP 5.6的源码(源码的位置为zend目录下zend_language_scanner.l大约是1014~1020行) ...
- Redis基础及入门
一. 什么是 Redis Redis 是一个可基于内存,有着完备的持久化机制并以 Key-Value 形式存储的非关系型数据库.也称为数据结构服务器. 二. Redis 的 ...
- ucore文件系统详解
最近一直在mooc上学习清华大学的操作系统课程,也算是复习下基本概念和原理,为接下来的找工作做准备. 每次深入底层源码都让我深感操作系统实现的琐碎,即使像ucore这样简单的kernel也让我烦躁不已 ...
- java线程优先级
java的线程优先级分为1-10 这10个等级 1为最强,最优先 10为最弱 如果大于10或者小于1则会抛异常 源代码为: public final void setPriority(int newP ...
- GET和POST传送数据的限制
GET 方法 请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的: /test/demo_form.asp?name1=value1&name2=value2 有关 GET ...
- iOS-UI控件优化
一.tableView的优化 tableView作为iOS开发中使用最为频繁的控件之一,对其进行优化,对整个应用性能的提升显得至关重要.官方设计的框架中,已经包含了UITableViewCell的重用 ...
- Apache+PHP+Mysql中文配置
一.安装Apache2 1.输入sudo apt-get install apache2下载安装apache2 2.输入Y回车确认 3.安装成功 Apache安装完成后,默认的网站根目录是" ...
- Hbase配置java客户端
1.修改windows配置文件 C:\WINDOWS\system32\drivers\etc\hosts 将远程hbase和zookeeper主机的IP地址加进去 54.0.88.53 H ...