最近为了解决跨域问题,做了一个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. Code::Blocks 配置

    需要另外下载安装GCC编译器 配置主题皮肤: 先替换' default.conf ' (需要关闭code::blocks) Settings>Editor>(左栏)Syntax highl ...

  2. Office 365 机器人(Bot)开发入门指南 (新篇)

    最近在整理书稿时,发现我在2017年7月份写的这篇 Office 365 机器人(Bot)开发入门 的内容,因为相关平台的升级,已经完全不能体现当前的开发过程,所以我再专门写一篇新的开发入门指南给有兴 ...

  3. 金融&业务常识积累

    前言 在项目中遇到很多名词,不太明白其含义.这些名词都是和金融领域紧密相关并且与项目的业务有着直接的联系.因此,决定通过搜集资料和归纳总结,对经后的工作产生一定的帮助. 常见的金融知识 PDL: Pa ...

  4. golang的GET请求(类似于PHP的CURL)

    check_url := "https://www.baidu.com" header := make(map[string]string) res, err := util.Hp ...

  5. 【动画】JQuery实现冒泡排序算法动画演示

    1 前言 冒泡排序是大家最熟悉的算法,也是最简单的排序算法,因其排序过程很象气泡逐渐向上漂浮而得名.为了更好的理解其基本的思想,毛三胖利用JQuery实现了冒泡排序的动画演示,并计划陆续实现其它排序算 ...

  6. Linux 6.4 设置yum 为centOS源

    一. 删除Redhat 自带的yum // root 用户执行 rpm -aq|grep yum|xargs rpm -e --nodeps 二 .下载CentOS 的 yum 安装文件 wget h ...

  7. Windows下如何硬盘安装Ubuntu

    一般来说,折腾双系统是每一位程序猿都有过的经历,如何在windows下安装双系统ubuntu呢?今天来给大家介绍一下如何直接在windows硬盘安装ubuntu,而不需要使用U盘或者光盘,或外置硬盘. ...

  8. Angular CurrencyPipe货币管道关于人民币符号¥的问题

    做项目(Angular项目)时经常需要处理金额的显示,需要在金额前面加上¥,但又不想用简单在前面加"¥"这么不优雅的方式,于是想到了CurrencyPipe.毕竟,Currency ...

  9. Machine Learning|Andrew Ng|Coursera 吴恩达机器学习笔记

    Week1: Machine Learning: A computer program is said to learn from experience E with respect to some ...

  10. 内置函数 -- bytes -- 字节码与字符串相互转换

    说明: 1. 返回值为一个新的不可修改字节数组,每个数字元素都必须在0 - 255范围内,是bytearray函数的具有相同的行为,差别仅仅是返回的字节数组不可修改. 2. 当3个参数都不传的时候,返 ...