node中异步处理Promise封装调用
来源:互联网 发布:蚌埠学校网络教务系统 编辑:程序博客网 时间:2024/05/17 23:20
--所需模块
安装模块 npm install bluebird logger
--所需模块
需求:在node中异步调用多个api返回数据处理
封装papi模块
/** * api请求封装 */var request = require('request');var Promise = require('bluebird');var config = require('../config'); //配置文件var logger = require('./logger')('console');module.exports = {// POST 请求封装post : function(req, api, params, getMoreInfo, isUpload){var formData = params || {};formData.rS = config.rS;if(typeof req.session.scsInfor !== 'undefined'){formData.loginUid = req.session.loginUid;formData.adUid = req.session.adUid;}var getMoreInfo = getMoreInfo || false;var isUpload = isUpload || false;if(req.session.token){formData.token = formData.accessToken = req.session.token || '';}var baseUrl = config.server_base;if(api.indexOf('http') >= 0){baseUrl = "";}var reqConf = {url : api,baseUrl : baseUrl,timeout : config.apiTime || 2000,time : true,method : "POST",headers : {},json : true,debug : false,gzip : true};if(isUpload == false){reqConf.form = formData;}else{reqConf.formData = formData;}return new Promise(function(resolve, reject){logger.info('[POST]', config.server_base + api, formData);request(reqConf, function(err, response, body){if(err){if(err.code == 'ESOCKETTIMEDOUT'){reject(new Error('接口调用超时: ' + '[' + api + ']'));}reject(new Error('请求接口出错: ' + '[' + api + ']' + err.message));logger.fatal(err);}else{if(response.statusCode == 200){if(body && body.code != undefined){if(getMoreInfo){logger.info('[POST]', api, '获取code任意状态返回SUCCESS');resolve(body);}else{if(body.code == 0){logger.info('[POST]', api, 'SUCCESS');resolve(body.data);}else{var msg = body.msg || '未知';logger.error('接口返回错误: ', api, '[' + body.code + '] ', msg);var apiErr = new Error('接口返回错误: ' + '[' + api + '] [' + body.errorCode + '] ' + msg);apiErr.errorCode = body.code;apiErr.apiMsg = msg;reject(apiErr);}}}else{logger.fatal("接口返回格式错误 :", api, body);reject(new Error("接口返回格式错误 :" + '[' + api + ']' + JSON.stringify(body)));}}else{var msg = body.msg || '请求接口错误';logger.fatal(api, response.statusCode, msg);reject(new Error('[' + api + '] [' + response.statusCode + '] ' + msg));}}});});}, // GET 请求封装get : function(req, api, params,callback){var qsData = params || {};qsData.rS = config.rS;if(typeof req.session.scsInfor !== 'undefined'){qsData.loginUid = req.session.loginUid;qsData.adUid = req.session.adUid;qsData.agUid = req.session.agUid;}if(req.session.token){qsData.token = req.session.token;}var baseUrl = config.server_base;if(api.indexOf('http') >= 0){baseUrl = "";}return new Promise(function(resolve, reject){logger.info('[GET]', config.server_base + api, qsData);request({url : api,baseUrl : baseUrl,timeout : 20000,time : true,method : "GET",headers : {},qs : qsData,json : true,debug : false,gzip : true}, function(err, response, body){if(err){logger.fatal(api, err);if(err.code == 'ESOCKETTIMEDOUT'){reject(new Error('接口调用超时: ' + api));}reject(new Error('请求接口出错: ' + '[' + api + '] ' + err.message));}else{if(response.statusCode == 200){if(body && body.code != undefined){if(body.code == 0){logger.info('[GET]', api, 'SUCCESS');var obj = callback ? callback(body.data) : body.data;resolve(obj);}else{var msg = body.msg || '未知';var apiErr = new Error('接口返回错误: [' + api + '] [' + body.code + ']' + msg);apiErr.errorCode = body.code;apiErr.apiMsg = msg;logger.error('接口返回错误: ', api, body.code, msg);reject(apiErr);}}else{logger.fatal("接口返回格式错误 :", api, body);reject(new Error('接口返回格式错误 :[' + api + ']' + JSON.stringify(body)));}}else{console.log('错误信息',body);logger.fatal(api, response.statusCode, msg);reject(new Error('[' + api + '][' + response.statusCode + '] ' + msg));}}});});}, // 路由url生成route : function(url, params){var query = [];var params = params || {};var href = url || '#';for(var key in params){query.push(key + '=' + params[key]);}if(query.length){href += '?' + query.join("&");}return href;}}
封装logger模块
var log4js = require('log4js');var config = require('../config');module.exports = function(type) {var name = type || 'console';log4js.configure(config.log);var logger = log4js.getLogger(name);return logger;}
调用dome
var PAPI = require('../../utils/papi');var Promise = require('bluebird');var logger = require('../../utils/logger')('console');module.exports = function (req, res) { // ################ // 接口调用示例 // PAPI.get(req,'user/user/token', { // uid: 1 // }).then(function(data) { // console.log("请求成功:" , data); // res.end(); // }).catch(function(err) { // console.log("#########出错了##############"); // console.error(err); // res.end(); // }); // ################ // 一次调用多个接口的示例, // then里面返回的 data是一个数组,顺序与all里定义的接口顺序一致 // 比如下例中: // data[0] 对应 user/user/token 接口调用返回值 // data[1] 对应 advert/campaign/list 接口调用返回值 // Promise.all([ // PAPI.get(req, 'user/user/token', { // uid: 1 // }), // PAPI.post(req,'advert/campaign/list') // ]).then(function(data){ // console.log(data[0]); // res.end(); // }).catch(function(err) { // console.error(err); // res.end(); // }); // ################ // A接口调用完成后再调用B接口的示例 PAPI.get(req, 'user/user/token', { uid: 1 }).then(function (token) { return PAPI.post(req, 'advert/campaign/list', { token: token.dmp_token }); }).then(function (list) { res.render('demos/hello', { layout: false, list: list }); }).catch(function (err) { console.error(err); res.render('error', { error: err }); });}
阅读全文
0 0
- node中异步处理Promise封装调用
- node中使用promise解决异步问题
- Node初学(二)Promise/Deferred模式,异步调用
- node 异步编程Promise容器
- promise封装node读写功能
- Node.js用ES6原生Promise对异步函数进行封装
- 微信小程序中使用Promise进行异步流程处理
- 异步调用 promise 的用法
- Node.js异步编程,promise,fibers
- promise中调用ajax
- Node.js中, 使用Q.ninvoke封装对象方法为promise
- 异步调用,异步处理
- Promise处理JS异步的问题
- angular 异步处理模式promise---$q
- promise加箭头函数处理异步结果
- node+ejs【封装ejs模板中直接调用js方法】
- 用Promise让Node的异步任务顺序执行
- node.js中async 异步处理 (类似多线程)
- 【pandas】[5] 数据行列转置,数据透视(stack,unstack,pviot,pviot_table)
- array_walk()使用
- 侃侃c++ this指针
- 随笔_1
- 温故而知新 JS函数
- node中异步处理Promise封装调用
- 如何免费下载百度文库,豆丁网等付费文章
- VC6-error LNK2001: unresolved external symbol _WinMain@16
- 变量(auto、static、extern、register)及其生存周期
- TCP/IP HTTP协议
- 使用 QJM 实现 HDFS 的 HA
- 修改sap的用户时间/时区与系统时间/时区
- 位移&二进制转换&原码&反码&补码
- Math类的常量与方法