使用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:戳这里

posted @ 2017-06-26 10:38  neromaycry  阅读(453)  评论(0编辑  收藏  举报