最近为了解决跨域问题,做了一个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. 微信小程序页面跳转的问题(app.json中设置tarBar后wx.redirectTo和wx.navigateTo均不能实现跳转到指定的页面)

    1.设置的tabBar代码片段: "tabBar": { "list": [ { "pagePath": "pages/homep ...

  2. 2018/2/11 ELK技术栈之ElasticSearch学习笔记二

    终于有时间记录一下最近学习的知识了,其实除了写下的这些还有很多很多,但懒得一一写下了: ElasticSearch添加修改删除原理:ElasticSearch的倒排索引和文档一旦生成就不允许修改(其实 ...

  3. java windows自动化-mail自动发邮件

    本文旨在让测试人员了解如何发邮件 发邮件的话,最简单的事是直接手动发邮件,但是在自动化测试中,应做到让机器或者代码来自动发送邮件,笔者大概了解以下几种方法,总有一款口味适合你:1java代码来做下面即 ...

  4. SaltStack 的远程执行机制

    html,body { font-size: 15px } body { font-family: Helvetica, "Hiragino Sans GB", "微软雅 ...

  5. Redis进阶实践之十一 Redis的Cluster集群搭建

    一.引言      本文档只对Redis的Cluster集群做简单的介绍,并没有对分布式系统的详细概念做深入的探讨.本文只是提供了有关如何设置集群.测试和操作集群的说明,而不涉及Redis集群规范中涵 ...

  6. 使用Scanner获取键盘输入

    使用Scanner类可以很方便地便获取用户的键盘输入,Scanner是一个基于正则表达式的文本扫描器,它可以从文件.输入流 .字符串中解析出基本类型值和字符串值.Scanner类提供了多个构造器,不同 ...

  7. qt中的多线程

    1.dialog.h #define DIALOG_H #include <QDialog>#include"mythread.h"namespace Ui {clas ...

  8. 自制PHP高防防盗链(不是一般的高)(思路)

    原理:根据IP,资源ID,时间戳,一次性Access_Token,APPKEY(暴露在前台)和APPSERECT(后台)来生成参数,具体见下面: 浏览器请求页面=>后台引用防盗链代码=>生 ...

  9. 使用EL表达式调用java方法

    首先,新建一个类,类中写一个静态方法 public class PrivilegeUtils { public static Boolean checkPrivilegeByName(User use ...

  10. appium+Python 启动app(一)

    当我们appium和Python环境都配置好了,如何启动我们第一个app呢?下面介绍appium+Python启动app的操作步骤,为了能够详细查看,我们这里使用夜游神模拟器进行示范. 测试项目:QQ ...