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.浪費這麼多時間~~

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章