使用Restify+superagent做数据转发

来源:互联网 发布:2016淘宝女鞋店铺排行 编辑:程序博客网 时间:2024/05/22 07:41

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

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

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

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

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

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

// api.jsvar 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.jsvar 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:戳这里