//来自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接入层