@@ -7,6 +7,8 @@ const redisDump = require('./tools/redis-dump');
7
7
* cached redis instance
8
8
*/
9
9
const redisInstanceCache = { } ;
10
+ const CONNECTED = 'connected' ;
11
+ const DISCONNECTED = 'disconnected' ;
10
12
11
13
/**
12
14
* connect redis and save the connection instance
@@ -23,54 +25,74 @@ async function connect(body) {
23
25
const redis = new Redis ( {
24
26
host : body . serverModel . ip , port : body . serverModel . port , db : body . serverModel . db ,
25
27
password : body . serverModel . password ,
28
+ showFriendlyErrorStack : true ,
26
29
} ) ;
27
30
const timeoutHandler = setTimeout ( ( ) => {
28
31
redis . disconnect ( ) ;
29
- reject ( errors . newBadRequestError ( "connect timeout!" ) ) ;
32
+ reject ( errors . newConnectTimeoutError ) ;
30
33
} , 3 * 1000 ) ;
31
34
32
35
redis . on ( 'error' , ( e ) => {
33
36
console . error ( e ) ;
34
- redisInstanceCache [ body . id ] = null ;
37
+ body . status = DISCONNECTED ;
38
+ if ( e instanceof Redis . MaxRetriesPerRequestError ) {
39
+ redisInstanceCache [ body . id ] = null ;
40
+ }
35
41
} ) ;
36
42
37
43
redis . on ( 'ready' , ( ) => {
38
44
redisInstanceCache [ body . id ] = redis ;
39
- body . status = 'connected' ;
45
+ body . status = CONNECTED ;
40
46
resolve ( body ) ;
41
47
clearTimeout ( timeoutHandler ) ;
42
48
} ) ;
43
49
} ) ;
44
50
}
45
51
46
52
/**
47
- * fetch the redis tree
53
+ * Get redis connection
54
+ *
48
55
* @param query the query params
49
56
*/
50
- async function fetchTree ( query ) {
57
+ function getRedis ( query ) {
51
58
const redis = redisInstanceCache [ query . id ] ;
52
- if ( ! redis ) {
53
- throw errors . newBadRequestError ( "Redis instance not exist" ) ;
59
+ if ( ! redis && redis . status !== CONNECTED ) {
60
+ throw errors . newConnectFailedError ;
54
61
}
62
+ return redis ;
63
+ }
64
+
65
+ /**
66
+ * fetch the redis tree
67
+ * @param query the query params
68
+ */
69
+ async function fetchTree ( query ) {
70
+ const redis = getRedis ( query ) ;
55
71
56
72
const root = { } ;
57
- const keys = query . keys || ( await redis . keys ( '*' ) ) ;
58
73
const lencommands = {
59
74
list : 'llen' ,
60
75
set : 'scard' ,
61
76
zset : 'zcard' ,
62
77
hash : 'hlen' ,
63
78
} ;
64
79
65
- for ( let i = 0 ; i < keys . length ; i ++ ) { // process types
66
- const key = keys [ i ] ;
67
- const type = await redis . type ( key ) ;
68
- root [ key ] = { type} ;
69
- if ( type !== 'string' ) {
70
- root [ key ] . len = await redis [ lencommands [ type ] ] ( key ) ;
71
- } else {
72
- root [ key ] . value = await redis . get ( key ) ;
80
+ let keys ;
81
+ try {
82
+ keys = query . keys || ( await redis . keys ( '*' ) ) ;
83
+
84
+ for ( let i = 0 ; i < keys . length ; i ++ ) { // process types
85
+ const key = keys [ i ] ;
86
+ const type = await redis . type ( key ) ;
87
+ root [ key ] = { type} ;
88
+ if ( type !== 'string' ) {
89
+ root [ key ] . len = await redis [ lencommands [ type ] ] ( key ) ;
90
+ } else {
91
+ root [ key ] . value = await redis . get ( key ) ;
92
+ }
73
93
}
94
+ } catch ( e ) {
95
+ throw errors . newReplyError ( e . message ) ;
74
96
}
75
97
76
98
const tree = { } ;
@@ -145,16 +167,14 @@ async function call(query, body) {
145
167
if ( ! lines || lines . length <= 0 ) {
146
168
return [ ] ;
147
169
}
148
- const redis = redisInstanceCache [ query . id ] ;
149
- if ( ! redis ) {
150
- throw errors . newBadRequestError ( "Redis instance not exist" ) ;
151
- }
170
+ const redis = getRedis ( query ) ;
171
+
152
172
const results = [ ] ;
153
173
for ( let i = 0 ; i < lines . length ; i ++ ) {
154
174
try {
155
175
results . push ( await redis . call ( ...lines [ i ] ) ) ;
156
176
} catch ( e ) {
157
- results . push ( ` ${ e . message } ` ) ;
177
+ throw errors . newReplyError ( e . message , i + 1 ) ;
158
178
}
159
179
}
160
180
return results ;
@@ -166,14 +186,12 @@ async function call(query, body) {
166
186
* @return {Promise<*> }
167
187
*/
168
188
async function dump ( query ) {
169
- const redis = redisInstanceCache [ query . id ] ;
170
- if ( ! redis ) {
171
- throw errors . newBadRequestError ( "Redis instance not exist" ) ;
172
- }
189
+ const redis = getRedis ( query ) ;
190
+
173
191
try {
174
192
return await redisDump ( query . exportType , redis ) ;
175
193
} catch ( e ) {
176
- throw errors . newBadRequestError ( "dump redis failed" ) ;
194
+ throw errors . newReplyError ( e . message ) ;
177
195
}
178
196
}
179
197
0 commit comments