美文网首页
webApp书城整站开发所得(一)

webApp书城整站开发所得(一)

作者: 前端白菜 | 来源:发表于2017-02-28 19:18 被阅读0次

    //来自service/service.js:

    exports.get_search_data = function(start, end, keyword){

    //因为请求http接口是异步的,所有会导致get_search_data

    //是异步的,我们不能直接返回,直接返回会有问题

    return function(cb){//所以我们需要返回一个异步函数去做这件事件

    var http = require('http');//用来发送请求

    var qs = require('querystring');//把obj对象转化为http查询参数

    var data = { //接受的参数

    s : keyword,

    start : start,

    end : end

    };

    var content = qs.stringify(data);//转化为查询字符串

    var http_request = { //指定要访问的地址

    hostname : 'doshu.xiaomi.com',

    port : 80,

    path : '/store/v0/lib/query/onebox?' + content

    };

    //上面组装好这些参数后,我们把请求发送出去

    var req_obj = http.request(http_request, function(_res){ //(请求地址,回调(response响应对象))

    var content = '';//返回的内容

    _res.setEncoding('utf8');//设定返回的数据格式限定

    _res.on('data', function(chunk){//当接受到数据的时候触发data事件,返回的数据是一段一段的chunk

    content += chunk;

    });

    _res.on('end', function(){

    cb(null, content);//把数据传出去 第一个参数为错误代码

    });//数据接受完后触发end事件

    });

    req_obj.on('error', function(){});//有可能响应出错

    req_obj.end();//发送请求,这时将进入上面的回调

    }

    };

    //来自app.js

    app.use(controller.get('/ajax/search', function*(){

    var qs = require('querystring');

    var queryObj = qs.parse(this.req._parsedUrl.query);//反转为对象

    var keyword = queryObj.keyword;

    var start = queryObj.start;

    var end = queryObj.end;

    this.body = yield service.get_search_data(start, end, keyword);

    }));

    为什么要对接口进行转发?(不在前端直接访问xiaomi获取数据,而是发给node,由node去访问xiaomi的数据再给前端)

    通过nodejs把接口再转发一次与直接使用后端接口相比,优缺点如何?实际开发为何采用这种方式?

    dushu.xiaomi.com:90/store/v0/lib/query/onebox?  vs  127.0.0.1:3000/ajax/search?

    感觉路径更清晰,而且接口的域名也统一了。但是查询的时候要多走一步。

    答案:

    如果业务层接口需要聚合多个数据源 和 不同业务 不同域的服务 怎么办?Node层最大的价值在于取代了web接入层

    相关文章

      网友评论

          本文标题:webApp书城整站开发所得(一)

          本文链接:https://www.haomeiwen.com/subject/siqfgttx.html