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

//来自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书城整站开发所得(一))