NodeJs微服务框架待填坑记录【01】

Seneca :NodeJS 微服务框架中 async.whilst 无效,不进入循环

  1. 这是运行在Seneca微服务框架中的
var datalist = [{number:10},{number:20},{number:30},{number:40},{number:50}];
	var count = 0;
    
    console.log('0000000000##datalist.length##'+datalist.length)
    console.log('0000000000##count##'+count);
	var test = function () {
        console.log('0000000000##count<datalist.length##'+(count<datalist.length));
		return count<datalist.length;
	};
 
	var fn = function(callback){
		console.log('xunhuantizhong-==='+datalist[count].number);
		setTimeout(function () {
            datalist[count].number += 1;
			count++;
			callback();
		},1000)
	};
	
	async.whilst(test,fn,function(err){
		if(err){
			console.log(err);
		}
        console.log('whilst结束');
        callback(httpReturn.success(datalist))
	});

以下日志输出,可以看出压根没进入循环体中,没有打印循环体中的console.log

2019-06-12 14:21:35: 0000000000##datalist.length##5
2019-06-12 14:21:35: 0000000000##count##0
2019-06-12 14:21:35: 0000000000##count<datalist.length##true
2019-06-12 14:21:40: {"notice":"seneca: Action role:center_proj failed: Client request timeout.","code":"act_execute","err":{"isBoom":true,"isServer":true,"output":{"statusCode":504,"payload":{"statusCode":504,"error":"Gateway Time-out","message":"Client request timeout"},"headers":{}},"eraro":true,"orig":{"isBoom":true,"isServer":true,"output":{"statusCode":504,"payload":{"statusCode":504,"error":"Gateway Time-out","message":"Client request timeout"},"headers":{}}},"code":"act_execute","seneca":true,"package":"seneca","msg":"seneca: Action role:center_proj failed: Client request timeout.","details":{"message":"Client request timeout","pattern":"role:center_proj","instance":"Seneca/aghe6os61t2f/1560320181638/11088/3.11.0/-","orig$":{"isBoom":true,"isServer":true,"output":{"statusCode":504,"payload":{"statusCode":504,"error":"Gateway Time-out","message":"Client request timeout"},"headers":{}}},"message$":"Client request timeout","plugin":{}},"callpoint":"at module.exports.internals.Utils.internals.Utils.handle_response (D:\\workspaces\\qxIotServerCenter\\qxiot2\\node_modules\\seneca-transport\\lib\\transport-utils.js:76:11)"},"actid":"qr19w8gll3ye/76won5y7qhv2","msg":{"body":{"device_id":"","proj_id":"","proj_num":"","proj_type_code":"","proj_name":"","province":"","city":"","sort":"","pageSize":"","pageNum":""},"files":{},"_username":"admin","_role":"1","_table":"iotuser","role":"center_proj","cmd":"project_list/query"},"meta":{"start":1560320495091,"end":1560320500648,"pattern":"role:center_proj","action":"transport_client_35","mi":"qr19w8gll3ye","tx":"76won5y7qhv2","id":"qr19w8gll3ye/76won5y7qhv2","instance":"aghe6os61t2f/1560320181638/11088/3.11.0/-","tag":"-","seneca":"3.11.0","version":"0.1.0","timeout":22222,"custom":{},"plugin":{"name":"client$","tag":"-","fullname":"client$"},"parents":[],"remote":false,"sync":true,"trace":[{"desc":[null,"qr19w8gll3ye/76won5y7qhv2",null,null,null,null,null,null,null],"trace":[]}],"sub":null,"data":null,"err":null,"err_trace":null,"error":true,"empty":null},"actdef":{"plugin_name":"client$","plugin_tag":"-","plugin_fullname":"client$","raw":{"role":"center_proj","client$":true,"strict$":{"add":true}},"plugin":{"name":"client$","tag":"-","fullname":"client$"},"sub":false,"client":true,"fixed":{},"custom":{},"id":"transport_client_35","name":"transport_client","pattern":"role:center_proj","msgcanon":{"role":"center_proj"},"priordef":{"plugin_name":"client$","plugin_tag":"-","plugin_fullname":"client$","raw":{"role":"center_proj","client$":true,"strict$":{"add":true}},"plugin":{"name":"client$","tag":"-","fullname":"client$"},"sub":false,"client":true,"fixed":{},"custom":{},"id":"transport_client_10","name":"transport_client","pattern":"role:center_proj","msgcanon":{"role":"center_proj"},"priorpath":"","rules":{}},"priorpath":"transport_client_10;","rules":{}},"client":true,"listen":false,"transport":{},"kind":"act","case":"ERR","duration":5557,"level":"error","plugin_name":"client$","plugin_tag":"-","pattern":"role:center_proj","seneca":"aghe6os61t2f/1560320181638/11088/3.11.0/-","when":1560320500649}
2019-06-12 14:21:40: 0000000000##datalist.length##5
2019-06-12 14:21:40: 0000000000##count##0
2019-06-12 14:21:40: 0000000000##count<datalist.length##true
2019-06-12 14:21:46: {"notice":"seneca: Action role:center_proj failed: Client request timeout.","code":"act_execute","err":{"isBoom":true,"isServer":true,"output":{"statusCode":504,"payload":{"statusCode":504,"error":"Gateway Time-out","message":"Client request timeout"},"headers":{}},"eraro":true,"orig":{"isBoom":true,"isServer":true,"output":{"statusCode":504,"payload":{"statusCode":504,"error":"Gateway Time-out","message":"Client request timeout"},"headers":{}}},"code":"act_execute","seneca":true,"package":"seneca","msg":"seneca: Action role:center_proj failed: Client request timeout.","details":{"message":"Client request timeout","pattern":"role:center_proj","instance":"Seneca/aghe6os61t2f/1560320181638/11088/3.11.0/-","orig$":{"isBoom":true,"isServer":true,"output":{"statusCode":504,"payload":{"statusCode":504,"error":"Gateway Time-out","message":"Client request timeout"},"headers":{}}},"message$":"Client request timeout","plugin":{}},"callpoint":"at module.exports.internals.Utils.internals.Utils.handle_response (D:\\workspaces\\qxIotServerCenter\\qxiot2\\node_modules\\seneca-transport\\lib\\transport-utils.js:76:11)"},"actid":"z3hk642rtsm1/ushoav15jzxu","msg":{"body":{"device_id":"","proj_id":"","proj_num":"","proj_type_code":"","proj_name":"","province":"","city":"","sort":"","pageSize":"","pageNum":""},"files":{},"_username":"admin","_role":"1","_table":"iotuser","role":"center_proj","cmd":"project_list/query"},"meta":{"start":1560320500652,"end":1560320506211,"pattern":"role:center_proj","action":"transport_client_37","mi":"z3hk642rtsm1","tx":"ushoav15jzxu","id":"z3hk642rtsm1/ushoav15jzxu","instance":"aghe6os61t2f/1560320181638/11088/3.11.0/-","tag":"-","seneca":"3.11.0","version":"0.1.0","timeout":22222,"custom":{},"plugin":{"name":"client$","tag":"-","fullname":"client$"},"parents":[],"remote":false,"sync":true,"trace":[{"desc":[null,"z3hk642rtsm1/ushoav15jzxu",null,null,null,null,null,null,null],"trace":[]}],"sub":null,"data":null,"err":null,"err_trace":null,"error":true,"empty":null},"actdef":{"plugin_name":"client$","plugin_tag":"-","plugin_fullname":"client$","raw":{"role":"center_proj","client$":true,"strict$":{"add":true}},"plugin":{"name":"client$","tag":"-","fullname":"client$"},"sub":false,"client":true,"fixed":{},"custom":{},"id":"transport_client_37","name":"transport_client","pattern":"role:center_proj","msgcanon":{"role":"center_proj"},"priordef":{"plugin_name":"client$","plugin_tag":"-","plugin_fullname":"client$","raw":{"role":"center_proj","client$":true,"strict$":{"add":true}},"plugin":{"name":"client$","tag":"-","fullname":"client$"},"sub":false,"client":true,"fixed":{},"custom":{},"id":"transport_client_35","name":"transport_client","pattern":"role:center_proj","msgcanon":{"role":"center_proj"},"priordef":{"plugin_name":"client$","plugin_tag":"-","plugin_fullname":"client$","raw":{"role":"center_proj","client$":true,"strict$":{"add":true}},"plugin":{"name":"client$","tag":"-","fullname":"client$"},"sub":false,"client":true,"fixed":{},"custom":{},"id":"transport_client_10","name":"transport_client","pattern":"role:center_proj","msgcanon":{"role":"center_proj"},"priorpath":"","rules":{}},"priorpath":"transport_client_10;","rules":{}},"priorpath":"transport_client_35;transport_client_10;","rules":{}},"client":true,"listen":false,"transport":{},"kind":"act","case":"ERR","duration":5559,"level":"error","plugin_name":"client$","plugin_tag":"-","pattern":"role:center_proj","seneca":"aghe6os61t2f/1560320181638/11088/3.11.0/-","when":1560320506212}
2019-06-12 14:21:57: {"notice":"seneca: Action cmd:project_list/query,role:center_proj failed: [TIMEOUT].","code":"act_execute","err":{"eraro":true,"orig":{},"code":"act_execute","seneca":true,"package":"seneca","msg":"seneca: Action cmd:project_list/query,role:center_proj failed: [TIMEOUT].","details":{"message":"[TIMEOUT]","pattern":"cmd:project_list/query,role:center_proj","instance":"Seneca/l52rbbl54pxi/1560320486596/11640/3.11.0/-","orig$":{},"message$":"[TIMEOUT]","plugin":{}},"callpoint":"at Object.act_tm [as ontm] (D:\\workspaces\\qxIotServerCenter\\qxiot2\\node_modules\\seneca\\seneca.js:969:52)"},"actid":"qr19w8gll3ye/76won5y7qhv2","msg":{"body":{"device_id":"","proj_id":"","proj_num":"","proj_type_code":"","proj_name":"","province":"","city":"","sort":"","pageSize":"","pageNum":""},"files":{},"_username":"admin","_role":"1","_table":"iotuser","role":"center_proj","cmd":"project_list/query","custom$":{},"transport$":{"track":["aghe6os61t2f/1560320181638/11088/3.11.0/-"],"origin":"aghe6os61t2f/1560320181638/11088/3.11.0/-","time":{"client_sent":"1560320495092"}},"tx$":"76won5y7qhv2"},"meta":{"start":1560320495102,"end":1560320517406,"pattern":"cmd:project_list/query,role:center_proj","action":"_28","mi":"qr19w8gll3ye","tx":"76won5y7qhv2","id":"qr19w8gll3ye/76won5y7qhv2","instance":"l52rbbl54pxi/1560320486596/11640/3.11.0/-","tag":"-","seneca":"3.11.0","version":"0.1.0","timeout":22222,"custom":{},"plugin":{"name":"center_proj","tag":"-","fullname":"center_proj"},"parents":[],"remote":false,"sync":true,"trace":[],"sub":null,"data":null,"err":null,"err_trace":null,"error":true,"empty":null},"actdef":{"plugin_name":"center_proj","plugin_tag":"-","plugin_fullname":"center_proj","raw":{"role":"center_proj","cmd":"project_list/query"},"plugin":{"name":"center_proj","tag":"-","fullname":"center_proj"},"sub":false,"client":false,"fixed":{},"custom":{},"id":"_28","name":"","pattern":"cmd:project_list/query,role:center_proj","msgcanon":{"cmd":"project_list/query","role":"center_proj"},"priorpath":"","rules":{}},"client":false,"listen":true,"transport":{"track":["aghe6os61t2f/1560320181638/11088/3.11.0/-"],"origin":"aghe6os61t2f/1560320181638/11088/3.11.0/-","time":{"client_sent":"1560320495092"}},"kind":"act","case":"ERR","duration":22304,"level":"error","plugin_name":"center_proj","plugin_tag":"-","pattern":"cmd:project_list/query,role:center_proj","seneca":"l52rbbl54pxi/1560320486596/11640/3.11.0/-","when":1560320517410}
2019-06-12 14:22:02: {"notice":"seneca: Action cmd:project_list/query,role:center_proj failed: [TIMEOUT].","code":"act_execute","err":{"eraro":true,"orig":{},"code":"act_execute","seneca":true,"package":"seneca","msg":"seneca: Action cmd:project_list/query,role:center_proj failed: [TIMEOUT].","details":{"message":"[TIMEOUT]","pattern":"cmd:project_list/query,role:center_proj","instance":"Seneca/l52rbbl54pxi/1560320486596/11640/3.11.0/-","orig$":{},"message$":"[TIMEOUT]","plugin":{}},"callpoint":"at Object.act_tm [as ontm] (D:\\workspaces\\qxIotServerCenter\\qxiot2\\node_modules\\seneca\\seneca.js:969:52)"},"actid":"z3hk642rtsm1/ushoav15jzxu","msg":{"body":{"device_id":"","proj_id":"","proj_num":"","proj_type_code":"","proj_name":"","province":"","city":"","sort":"","pageSize":"","pageNum":""},"files":{},"_username":"admin","_role":"1","_table":"iotuser","role":"center_proj","cmd":"project_list/query","custom$":{},"transport$":{"track":["aghe6os61t2f/1560320181638/11088/3.11.0/-"],"origin":"aghe6os61t2f/1560320181638/11088/3.11.0/-","time":{"client_sent":"1560320500654"}},"tx$":"ushoav15jzxu"},"meta":{"start":1560320500655,"end":1560320522882,"pattern":"cmd:project_list/query,role:center_proj","action":"_28","mi":"z3hk642rtsm1","tx":"ushoav15jzxu","id":"z3hk642rtsm1/ushoav15jzxu","instance":"l52rbbl54pxi/1560320486596/11640/3.11.0/-","tag":"-","seneca":"3.11.0","version":"0.1.0","timeout":22222,"custom":{},"plugin":{"name":"center_proj","tag":"-","fullname":"center_proj"},"parents":[],"remote":false,"sync":true,"trace":[],"sub":null,"data":null,"err":null,"err_trace":null,"error":true,"empty":null},"actdef":{"plugin_name":"center_proj","plugin_tag":"-","plugin_fullname":"center_proj","raw":{"role":"center_proj","cmd":"project_list/query"},"plugin":{"name":"center_proj","tag":"-","fullname":"center_proj"},"sub":false,"client":false,"fixed":{},"custom":{},"id":"_28","name":"","pattern":"cmd:project_list/query,role:center_proj","msgcanon":{"cmd":"project_list/query","role":"center_proj"},"priorpath":"","rules":{}},"client":false,"listen":true,"transport":{"track":["aghe6os61t2f/1560320181638/11088/3.11.0/-"],"origin":"aghe6os61t2f/1560320181638/11088/3.11.0/-","time":{"client_sent":"1560320500654"}},"kind":"act","case":"ERR","duration":22227,"level":"error","plugin_name":"center_proj","plugin_tag":"-","pattern":"cmd:project_list/query,role:center_proj","seneca":"l52rbbl54pxi/1560320486596/11640/3.11.0/-","when":1560320522883}
  1. 这是在正常接口下的代码,不运行在微服务框架下,由于项目需要改成微服务,也就是原先的代码
console.log("go in ... ... ... ... ");


    var datalist = [{number:10},{number:20},{number:30},{number:40},{number:50}];
	var count = 0;
    
    console.log('0000000000##datalist.length##'+datalist.length)
    console.log('0000000000##count##'+count);
	var test = function () {
        console.log('0000000000##count<datalist.length##'+(count<datalist.length));
		return count<datalist.length;
	};
 
	var fn = function(callback){
		console.log('xunhuantizhong-==='+datalist[count].number);
		setTimeout(function () {
            datalist[count].number += 1;
			count++;
			callback();
		},1000)
	};
	
	async.whilst(test,fn,function(err){
		if(err){
			console.log(err);
		}
        console.log('whilst结束');
        callback(ServiceResponse.res.success(datalist))
	});

以下是输出和接口调试结果

go in ... ... ... ...
0000000000##datalist.length##5
0000000000##count##0
0000000000##count<datalist.length##true
xunhuantizhong-===10
0000000000##count<datalist.length##true
xunhuantizhong-===20
0000000000##count<datalist.length##true
xunhuantizhong-===30
0000000000##count<datalist.length##true
xunhuantizhong-===40
0000000000##count<datalist.length##true
xunhuantizhong-===50
0000000000##count<datalist.length##false
whilst结束
{
"code": 1,
"msg": "操作成功",
"data":[
{
"number": 11
},
{
"number": 21
},
{
"number": 31
},
{
"number": 41
},
{
"number": 51
}
]
}

总结:一样的代码,但是在Seneca构建的微服务下,就不能正常运行。

解决方案:将async.whilst 写法改成 async.map的写法,但是具体原因还是未知!希望有知道的大佬能在看到这篇文章之后不吝告知~~

 

最终结论与解决方式:

果然人还是不能轻易放弃标准,经过查询一番,终于还是找到了于async模块的文档,起先一直搜索async官方文档,但是一直没找到,后面是找到了GitHub的开源,找到的开发说明文档。链接:

https://caolan.github.io/async/v3/docs.html#whilst

对比async.whilst的写法,不难看出,循环判断条件的差异,网上都是直接return的而官方例子是callback的。

 

改成和官方文档一致的callback就OJBK了。

真的服,看来万事还是得以官方为准。

var count = 0;

    var datalist = [{number:10},{number:20},{number:30},{number:40},{number:50}];
	var count = 0;
    
    console.log('0000000000##datalist.length##'+datalist.length)
    console.log('0000000000##count##'+count);
	var test = function (callback) {
        console.log('0000000000##count<datalist.length##'+(count<datalist.length));
        callback(null, count<datalist.length);
	};
 
	var fn = function(callback){
		console.log('xunhuantizhong-==='+datalist[count].number);
		setTimeout(function () {
            datalist[count].number += 1;
			count++;
			callback();
		},1000)
	};
	
	async.whilst(test,fn,function(err){
		if(err){
			console.log(err);
		}
        console.log('whilst结束');
        callback(httpReturn.success(datalist))
	});
2019-06-12 15:30:59: {"kind":"plugin","case":"ready","name":"transport","level":"info","actid":"sfvgalgm6ihe/nq8lg0bkwyzx","plugin_name":"transport","pattern":"name:transport,plugin:define,role:seneca,seq:1,tag:undefined","seneca":"jz2iiugvzqef/1560324658113/4024/3.11.0/-","when":1560324659064}
2019-06-12 15:30:59: {"kind":"plugin","case":"ready","name":"center_proj","level":"info","actid":"stp0j9hw2r3e/vozd6knt4z2f","plugin_name":"center_proj","pattern":"name:center_proj,plugin:define,role:seneca,seq:2,tag:undefined","seneca":"jz2iiugvzqef/1560324658113/4024/3.11.0/-","when":1560324659092}
2019-06-12 15:30:59: {"kind":"notice","notice":"hello seneca jz2iiugvzqef/1560324658113/4024/3.11.0/-","level":"info","seneca":"jz2iiugvzqef/1560324658113/4024/3.11.0/-","when":1560324659124}
2019-06-12 15:31:01: 0000000000##datalist.length##5
2019-06-12 15:31:01: 0000000000##count##0
2019-06-12 15:31:01: 0000000000##count<datalist.length##true
2019-06-12 15:31:01: xunhuantizhong-===10
2019-06-12 15:31:01: 0000000000##count<datalist.length##true
2019-06-12 15:31:01: xunhuantizhong-===20
2019-06-12 15:31:01: 0000000000##count<datalist.length##true
2019-06-12 15:31:01: xunhuantizhong-===30
2019-06-12 15:31:01: 0000000000##count<datalist.length##true
2019-06-12 15:31:01: xunhuantizhong-===40
2019-06-12 15:31:01: 0000000000##count<datalist.length##true
2019-06-12 15:31:01: xunhuantizhong-===50
2019-06-12 15:31:01: 0000000000##count<datalist.length##false
2019-06-12 15:31:01: whilst结束

完毕,CNM.浪费这么多时间~~

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值