使用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 ...
随机推荐
- python学习:简单的wc命令实现
#!/usr/bin/python import sys import os try: fn = sys.argv[1] except IndexError: print &q ...
- 使用scp从远程服务器下载文件到本地
[下载远程文件到本地] scp -P 6008 root@192.168.1.123:/usr/data/1.zip /Users/abc/www [上传本地文件到远程] scp -P 6008 ...
- linux命令详解:pgrep命令
转载:http://www.th7.cn/system/lin/201311/46742.shtml 前言 经常要查看进程的信息,包括进程的是否已经消亡,通过pgrep来获得正在被调度的进程的相 ...
- php环境下所有的配置文件以及作用
以下主要是针对linux下的目录(windows也是一样,文件名都一样) Apache:etc/httpd.conf PHP:etc/php.ini (Apache 正在运行的 PHP 版本) M ...
- maven常用命令介绍
mvn 3.0.4 创建maven项目命令 mvn archetype:generate -DgroupId=damocles-autocredit -DartifactId=damocles ...
- bcache的使用
一.前提:内核中需要配置bcache模块 1.1 检查 - 是否存在于内核中:检查/sys/fs/bcache目录是否存在,没有说明内核中没有bcache - 是否以内核模块方式存在:检查/lib/m ...
- iOS 添加WKWebView导致控制器无法释放的问题
在WkWebView与JavaScript交互中,经常会在原生中注入MessageHandler,app中注入MessageHandler的方法 WKWebViewConfiguration *con ...
- ContentProvider工作过程
ContentProvider启动过程(通过query方法触发) ContentProvider.acquireProvider--> ApplicationContentResolver.ac ...
- shiro整合ehcache
目标:让Shiro整合ehcache,提供缓存realm数据的功能. 1.引入encache配置文件,配置缓存 <!-- <ehcache xmlns:xsi="http://w ...
- session不会过期
$(function () { window.setInterval(function () { $.post('random.html'); }, 60000); }); 加在母版页里,使用与长时间 ...