@@ -91,6 +91,8 @@ export default class Cos {
91
91
credentials : CapiCredentials ;
92
92
region : RegionType ;
93
93
cosClient : COS ;
94
+ retryTimes : number ;
95
+ maxRetryTimes : number ;
94
96
95
97
constructor ( credentials : CapiCredentials = { } , region : RegionType = 'ap-guangzhou' ) {
96
98
this . region = region ;
@@ -103,6 +105,10 @@ export default class Cos {
103
105
this . credentials . XCosSecurityToken = credentials . Token ;
104
106
}
105
107
this . cosClient = new COS ( this . credentials ) ;
108
+
109
+ // 支持 CreateBucket 重试一次
110
+ this . retryTimes = 0 ;
111
+ this . maxRetryTimes = 1 ;
106
112
}
107
113
108
114
async isBucketExist ( bucket : string ) {
@@ -118,20 +124,22 @@ export default class Cos {
118
124
}
119
125
120
126
async createBucket ( inputs : CosCreateBucketInputs = { } ) {
121
- // 在创建之前,检查是否存在
122
- const exist = await this . isBucketExist ( inputs . bucket ! ) ;
123
- if ( exist ) {
124
- return true ;
127
+ // TODO: HeadBucket 请求如果 404 COS 会缓存,暂时不能使用,只能直接调用 CreateBucket
128
+ // const exist = await this.isBucketExist(inputs.bucket!);
129
+ // if (exist) {
130
+ // return true;
131
+ // }
132
+ if ( this . retryTimes === 0 ) {
133
+ console . log ( `Creating bucket ${ inputs . bucket } ` ) ;
125
134
}
126
- // 不存在就尝试创建
127
- console . log ( `Creating bucket ${ inputs . bucket } ` ) ;
128
135
const createParams = {
129
136
Bucket : inputs . bucket ! ,
130
137
Region : this . region ,
131
138
} ;
132
139
133
140
try {
134
141
await this . cosClient . putBucket ( createParams ) ;
142
+ this . retryTimes = 0 ;
135
143
} catch ( err ) {
136
144
const e = convertCosError ( err ) ;
137
145
if ( e . code === 'BucketAlreadyExists' || e . code === 'BucketAlreadyOwnedByYou' ) {
@@ -141,30 +149,12 @@ export default class Cos {
141
149
console . log ( `Bucket ${ inputs . bucket } already exist.` ) ;
142
150
}
143
151
} else {
144
- // TODO: cos在云函数中可能出现ECONNRESET错误,没办法具体定位,初步猜测是客户端问题,是函数启动网络还没准备好,这个还不确定,所以在这里做兼容
145
- if ( e ?. message ?. includes ( 'ECONNRESET' ) ) {
146
- // 检查bucket是否存在
147
- try {
148
- const isHave = await this . cosClient . headBucket ( createParams ) ;
149
- if ( isHave . statusCode === 200 ) {
150
- if ( ! inputs . force ) {
151
- throw new ApiError ( {
152
- type : `API_COS_headBucket` ,
153
- message : `Bucket ${ inputs . bucket } already exist` ,
154
- } ) ;
155
- } else {
156
- console . log ( `Bucket ${ inputs . bucket } already exist` ) ;
157
- }
158
- } else {
159
- throw new ApiError ( {
160
- type : `API_COS_headBucket` ,
161
- message : `Could not find bucket ${ inputs . bucket } ` ,
162
- } ) ;
163
- }
164
- } catch ( errAgain ) {
165
- throw constructCosError ( `API_COS_headBucket` , errAgain ) ;
166
- }
152
+ // 失败重试 1 次,如果再次出错,正常处理
153
+ if ( this . retryTimes < this . maxRetryTimes ) {
154
+ this . retryTimes ++ ;
155
+ await this . createBucket ( inputs ) ;
167
156
} else {
157
+ this . retryTimes = 0 ;
168
158
throw constructCosError ( `API_COS_putBucket` , err ) ;
169
159
}
170
160
}
@@ -531,7 +521,7 @@ export default class Cos {
531
521
await this . flushBucketFiles ( bucket ) ;
532
522
}
533
523
534
- console . log ( `Uploding files to bucket ${ bucket } ` ) ;
524
+ console . log ( `Uploading files to bucket ${ bucket } ` ) ;
535
525
536
526
/** 上传文件夹 */
537
527
if ( inputs . dir && fs . existsSync ( inputs . dir ) ) {
0 commit comments