mof-request
Version:
A middleware wrapped request.js module for floodesh
74 lines (55 loc) • 1.88 kB
JavaScript
const request = require('request')
module.exports = globalOptions=>{
let requestOptions = [
'uri','url','qs','method','headers','body','form','json','multipart','followRedirect',
'followAllRedirects', 'maxRedirects','encoding','pool','timeout','proxy','auth','oauth',
'strictSSL','jar','aws','gzip','time','tunnel','proxyHeaderWhiteList','proxyHeaderExclusiveList',
'localAddress','forever'];
globalOptions=globalOptions||{};
return function* (ctx, next) {
yield new Promise((resolve,reject) => {
let options = {timeout:15000,encoding:null,gzip:true,time:true,headers:{}};
merge(options,globalOptions);
merge(options,ctx.opt);
options = pick(options, requestOptions);
merge(options.headers,globalOptions.headers);
merge(options.headers,ctx.opt.headers);
ctx.app.logger.debug("Requesting: %s", options.uri, options);
if(ctx.scounter) ctx.scounter('request');
ctx.ts = new Date();
request(options, (err,res) => {
ctx.app.logger.debug("Requested: %s", options.uri);
if(ctx.stiming) ctx.stiming("response");
if(err){
if(ctx.scounter) ctx.scounter('request.error');
return reject(err);
}
ctx.app.logger.verbose("Network time: %d ms", res.elapsedTime);
ctx.response.res = res;
ctx.request.req = res.request; // attach an instance of `Request` while got response, need see if it is necessary.
resolve();
});
});
return next();
}
}
function merge(a, b){
if (a && b) {
for (var key in b) {
if(typeof b[key] === 'object'){
a[key] = JSON.parse(JSON.stringify(b[key]));
}else{
a[key] = b[key];
}
}
}
return a;
}
function pick(options, keys){
return keys.reduce((obj,key) => {
if(options.hasOwnProperty(key))
obj[key] = options[key];
return obj;
},Object.create(null));
}