@yunzhanghu/sdk-nodejs 1.0.7 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,72 @@
1
+ const yzhAPI = require('../yzh/index.js')
2
+ const config = require('./conf/config.js')
3
+
4
+ // 个体工商户注册(云账户共享大额 H5)
5
+ const bizlicgxv2h5 = new yzhAPI.BizlicGxV2H5ServiceClient({
6
+ ...config,
7
+ base_url: 'https://api-aic.yunzhanghu.com/',
8
+ })
9
+
10
+ // 预启动
11
+ bizlicgxv2h5
12
+ .GxV2H5GetStartUrl({
13
+
14
+ /**
15
+ * @param {string} request-id:请求 ID,请求的唯一标识
16
+ * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
17
+ * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
18
+ */
19
+ request_id: 'requestIdExample123456789',
20
+ dealer_id: config.dealer_id,
21
+ broker_id: config.broker_id,
22
+ dealer_user_id: 'userId1234567890',
23
+ client_type: 1,
24
+ notify_url: 'https://www.example.com',
25
+ color: '#007AFF',
26
+ return_url: 'https://www.example.com',
27
+ customer_title: 1,
28
+ })
29
+ .then((data) => {
30
+ if (data.code === '0000') {
31
+ // 操作成功
32
+ console.log('操作成功 ', data.data)
33
+ } else {
34
+ // 失败返回
35
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
36
+ }
37
+ })
38
+ .catch((err) => {
39
+ // 发生异常
40
+ console.log(err.toString())
41
+ })
42
+
43
+ // 查询个体工商户状态
44
+ bizlicgxv2h5
45
+ .GxV2H5GetAicStatus({
46
+
47
+ /**
48
+ * @param {string} request-id:请求 ID,请求的唯一标识
49
+ * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
50
+ * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
51
+ */
52
+ request_id: 'requestIdExample123456789',
53
+ dealer_id: config.dealer_id,
54
+ broker_id: config.broker_id,
55
+ open_id: 'openId1234567890',
56
+ real_name: '张三',
57
+ id_card: '11010519491231002X',
58
+ dealer_user_id: 'userId1234567890',
59
+ })
60
+ .then((data) => {
61
+ if (data.code === '0000') {
62
+ // 操作成功
63
+ console.log('操作成功 ', data.data)
64
+ } else {
65
+ // 失败返回
66
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
67
+ }
68
+ })
69
+ .catch((err) => {
70
+ // 发生异常
71
+ console.log(err.toString())
72
+ })
@@ -0,0 +1,108 @@
1
+ const yzhAPI = require('../yzh/index.js')
2
+ const config = require('./conf/config.js')
3
+
4
+ // 个体工商户注册(云账户共享大额 H5+API)
5
+ const bizlicgxv2h5api = new yzhAPI.BizlicGxV2H5APIServiceClient({
6
+ ...config,
7
+ base_url: 'https://api-aic.yunzhanghu.com/',
8
+ })
9
+
10
+ // 工商实名信息录入
11
+ bizlicgxv2h5api
12
+ .GxV2H5APIPreCollectBizlicMsg({
13
+
14
+ /**
15
+ * @param {string} request-id:请求 ID,请求的唯一标识
16
+ * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
17
+ * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
18
+ */
19
+ request_id: 'requestIdExample123456789',
20
+ dealer_id: config.dealer_id,
21
+ broker_id: config.broker_id,
22
+ dealer_user_id: 'userId1234567890',
23
+ phone_no: '+86-188****8888',
24
+ real_name: '张三',
25
+ id_card: '11010519491231002X',
26
+ id_card_address: '省级行政区名称区县级行政区名称具体住宿地址',
27
+ id_card_agency: '区县公安局名称',
28
+ id_card_nation: '20',
29
+ id_card_validity_start: '2022-02-22',
30
+ id_card_validity_end: '2042-02-22',
31
+ })
32
+ .then((data) => {
33
+ if (data.code === '0000') {
34
+ // 操作成功
35
+ console.log('操作成功 ', data.data)
36
+ } else {
37
+ // 失败返回
38
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
39
+ }
40
+ })
41
+ .catch((err) => {
42
+ // 发生异常
43
+ console.log(err.toString())
44
+ })
45
+
46
+ // 预启动
47
+ bizlicgxv2h5api
48
+ .GxV2H5APIGetStartUrl({
49
+
50
+ /**
51
+ * @param {string} request-id:请求 ID,请求的唯一标识
52
+ * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
53
+ * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
54
+ */
55
+ request_id: 'requestIdExample123456789',
56
+ dealer_id: config.dealer_id,
57
+ broker_id: config.broker_id,
58
+ dealer_user_id: 'userId1234567890',
59
+ client_type: 2,
60
+ notify_url: 'https://www.example.com',
61
+ color: '#007AFF',
62
+ return_url: 'https://www.example.com',
63
+ customer_title: 1,
64
+ })
65
+ .then((data) => {
66
+ if (data.code === '0000') {
67
+ // 操作成功
68
+ console.log('操作成功 ', data.data)
69
+ } else {
70
+ // 失败返回
71
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
72
+ }
73
+ })
74
+ .catch((err) => {
75
+ // 发生异常
76
+ console.log(err.toString())
77
+ })
78
+
79
+ // 查询个体工商户状态
80
+ bizlicgxv2h5api
81
+ .GxV2H5APIGetAicStatus({
82
+
83
+ /**
84
+ * @param {string} request-id:请求 ID,请求的唯一标识
85
+ * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
86
+ * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
87
+ */
88
+ request_id: 'requestIdExample123456789',
89
+ dealer_id: config.dealer_id,
90
+ broker_id: config.broker_id,
91
+ dealer_user_id: 'userId1234567890',
92
+ real_name: '张三',
93
+ id_card: '11010519491231002X',
94
+ open_id: 'openId1234567890',
95
+ })
96
+ .then((data) => {
97
+ if (data.code === '0000') {
98
+ // 操作成功
99
+ console.log('操作成功 ', data.data)
100
+ } else {
101
+ // 失败返回
102
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
103
+ }
104
+ })
105
+ .catch((err) => {
106
+ // 发生异常
107
+ console.log(err.toString())
108
+ })
@@ -1,12 +1,12 @@
1
1
  const config = {
2
2
  // 平台企业 ID,登录云账户综合服务平台,选择“业务中心 > 业务管理 > 对接信息”获取
3
- dealer_id: "200***62",
3
+ dealer_id: '200***62',
4
4
  // 综合服务主体 ID,登录云账户综合服务平台,选择“业务中心 > 业务管理 > 对接信息”获取
5
- broker_id: "xj***t",
5
+ broker_id: 'xj***t',
6
6
  // 平台企业 App Key,登录云账户综合服务平台,选择“业务中心 > 业务管理 > 对接信息”获取
7
- app_key: "36pr4E***ofEd",
7
+ app_key: '36pr4E***ofEd',
8
8
  // 平台企业 3DES Key,登录云账户综合服务平台,选择“业务中心 > 业务管理 > 对接信息”获取
9
- des3_key: "Y54w5g***x9jv",
9
+ des3_key: 'Y54w5g***x9jv',
10
10
  // 平台企业私钥,自行生成 RSA 公私钥,私钥请妥善保存,谨防泄露。平台企业公钥请登录云账户综合服务平台配置,选择“业务中心 > 业务管理 > 对接信息”,单击页面右上角的“编辑”,完成平台企业公钥配置
11
11
  private_key: `-----BEGIN PRIVATE KEY-----
12
12
  MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC1LHsuXz2JQ01f
@@ -25,7 +25,14 @@ QqP7lt6FdvzGxehaHwIDAQAB
25
25
  -----END PUBLIC KEY-----`,
26
26
  // 签名方式,登录云账户综合服务平台,选择“业务中心 > 业务管理 > 对接信息”获取
27
27
  // 签名方式为 RSA,参数固定为:rsa
28
- sign_type: "rsa",
28
+ sign_type: 'rsa',
29
+ // 请求域名
30
+ // 生产环境请求域名
31
+ base_url: 'https://api-service.yunzhanghu.com',
32
+ // 沙箱环境请求域名
33
+ // base_url: 'https://api-service.yunzhanghu.com/sandbox',
34
+ // 个体工商户注册请求域名
35
+ // base_url: 'https://api-aic.yunzhanghu.com',
29
36
  // 请求超时时间,默认 30S
30
37
  timeout: 30 * 1000,
31
38
  }
@@ -1,5 +1,5 @@
1
- const yzhAPI = require("../yzh/index.js")
2
- const config = require("./conf/config.js")
1
+ const yzhAPI = require('../yzh/index.js')
2
+ const config = require('./conf/config.js')
3
3
 
4
4
  // 对账文件获取
5
5
  const dataService = new yzhAPI.DataServiceClient(config)
@@ -13,16 +13,16 @@ dataService
13
13
  * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
14
14
  * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
15
15
  */
16
- request_id: "requestIdExample123456789",
17
- order_date: "2023-01-13",
16
+ request_id: 'requestIdExample123456789',
17
+ order_date: '2023-01-13',
18
18
  })
19
19
  .then((data) => {
20
- if (data.code === "0000") {
20
+ if (data.code === '0000') {
21
21
  // 操作成功
22
- console.log("操作成功 ", data.data)
22
+ console.log('操作成功 ', data.data)
23
23
  } else {
24
24
  // 失败返回
25
- console.log("失败返回 ", "code:" + data.code + " message:" + data.message + " request_id:" + data.request_id)
25
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
26
26
  }
27
27
  })
28
28
  .catch((err) => {
@@ -39,16 +39,16 @@ dataService
39
39
  * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
40
40
  * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
41
41
  */
42
- request_id: "requestIdExample123456789",
43
- bill_date: "2023-01-13",
42
+ request_id: 'requestIdExample123456789',
43
+ bill_date: '2023-01-13',
44
44
  })
45
45
  .then((data) => {
46
- if (data.code === "0000") {
46
+ if (data.code === '0000') {
47
47
  // 操作成功
48
- console.log("操作成功 ", data.data)
48
+ console.log('操作成功 ', data.data)
49
49
  } else {
50
50
  // 失败返回
51
- console.log("失败返回 ", "code:" + data.code + " message:" + data.message + " request_id:" + data.request_id)
51
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
52
52
  }
53
53
  })
54
54
  .catch((err) => {
@@ -65,17 +65,17 @@ dataService
65
65
  * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
66
66
  * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
67
67
  */
68
- request_id: "requestIdExample123456789",
69
- begin_at: "2023-01-01",
70
- end_at: "2023-01-30",
68
+ request_id: 'requestIdExample123456789',
69
+ begin_at: '2023-01-01',
70
+ end_at: '2023-01-30',
71
71
  })
72
72
  .then((data) => {
73
- if (data.code === "0000") {
73
+ if (data.code === '0000') {
74
74
  // 操作成功
75
- console.log("操作成功 ", JSON.stringify(data, null, 2))
75
+ console.log('操作成功 ', JSON.stringify(data, null, 2))
76
76
  } else {
77
77
  // 失败返回
78
- console.log("失败返回 ", "code:" + data.code + " message:" + data.message + " request_id:" + data.request_id)
78
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
79
79
  }
80
80
  })
81
81
  .catch((err) => {
@@ -92,20 +92,20 @@ dataService
92
92
  * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
93
93
  * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
94
94
  */
95
- request_id: "requestIdExample123456789",
96
- order_date: "2023-01-13",
95
+ request_id: 'requestIdExample123456789',
96
+ order_date: '2023-01-13',
97
97
  offset: 0,
98
98
  length: 100,
99
- channel: "",
100
- data_type: "",
99
+ channel: '',
100
+ data_type: '',
101
101
  })
102
102
  .then((data) => {
103
- if (data.code === "0000") {
103
+ if (data.code === '0000') {
104
104
  // 操作成功
105
- console.log("操作成功 ", JSON.stringify(data, null, 2))
105
+ console.log('操作成功 ', JSON.stringify(data, null, 2))
106
106
  } else {
107
107
  // 失败返回
108
- console.log("失败返回 ", "code:" + data.code + " message:" + data.message + " request_id:" + data.request_id)
108
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
109
109
  }
110
110
  })
111
111
  .catch((err) => {
@@ -122,16 +122,16 @@ dataService
122
122
  * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
123
123
  * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
124
124
  */
125
- request_id: "requestIdExample123456789",
126
- order_date: "2023-01-13",
125
+ request_id: 'requestIdExample123456789',
126
+ order_date: '2023-01-13',
127
127
  })
128
128
  .then((data) => {
129
- if (data.code === "0000") {
129
+ if (data.code === '0000') {
130
130
  // 操作成功
131
- console.log("操作成功 ", data.data)
131
+ console.log('操作成功 ', data.data)
132
132
  } else {
133
133
  // 失败返回
134
- console.log("失败返回 ", "code:" + data.code + " message:" + data.message + " request_id:" + data.request_id)
134
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
135
135
  }
136
136
  })
137
137
  .catch((err) => {
@@ -148,19 +148,19 @@ dataService
148
148
  * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
149
149
  * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
150
150
  */
151
- request_id: "requestIdExample123456789",
152
- bill_date: "2022-10-28",
151
+ request_id: 'requestIdExample123456789',
152
+ bill_date: '2022-10-28',
153
153
  offset: 0,
154
154
  length: 100,
155
- data_type: "",
155
+ data_type: '',
156
156
  })
157
157
  .then((data) => {
158
- if (data.code === "0000") {
158
+ if (data.code === '0000') {
159
159
  // 操作成功
160
- console.log("操作成功 ", JSON.stringify(data, null, 2))
160
+ console.log('操作成功 ', JSON.stringify(data, null, 2))
161
161
  } else {
162
162
  // 失败返回
163
- console.log("失败返回 ", "code:" + data.code + " message:" + data.message + " request_id:" + data.request_id)
163
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
164
164
  }
165
165
  })
166
166
  .catch((err) => {
@@ -177,16 +177,16 @@ dataService
177
177
  * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
178
178
  * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
179
179
  */
180
- request_id: "requestIdExample123456789",
181
- statement_date: "2022-10-28",
180
+ request_id: 'requestIdExample123456789',
181
+ statement_date: '2022-10-28',
182
182
  })
183
183
  .then((data) => {
184
- if (data.code === "0000") {
184
+ if (data.code === '0000') {
185
185
  // 操作成功
186
- console.log("操作成功 ", JSON.stringify(data, null, 2))
186
+ console.log('操作成功 ', JSON.stringify(data, null, 2))
187
187
  } else {
188
188
  // 失败返回
189
- console.log("失败返回 ", "code:" + data.code + " message:" + data.message + " request_id:" + data.request_id)
189
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
190
190
  }
191
191
  })
192
192
  .catch((err) => {
@@ -1,5 +1,5 @@
1
- const yzhAPI = require("../yzh/index.js")
2
- const config = require("./conf/config.js")
1
+ const yzhAPI = require('../yzh/index.js')
2
+ const config = require('./conf/config.js')
3
3
 
4
4
  // 用户签约(H5 签约)
5
5
  const h5usersign = new yzhAPI.H5UserSignServiceClient(config)
@@ -13,20 +13,20 @@ h5usersign
13
13
  * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
14
14
  * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
15
15
  */
16
- request_id: "requestIdExample123456789",
16
+ request_id: 'requestIdExample123456789',
17
17
  dealer_id: config.dealer_id,
18
18
  broker_id: config.broker_id,
19
- real_name: "张三",
20
- id_card: "11010519491231002X",
19
+ real_name: '张三',
20
+ id_card: '11010519491231002X',
21
21
  certificate_type: 0,
22
22
  })
23
23
  .then((data) => {
24
- if (data.code === "0000") {
24
+ if (data.code === '0000') {
25
25
  // 操作成功
26
- console.log("操作成功 ", data.data)
26
+ console.log('操作成功 ', data.data)
27
27
  } else {
28
28
  // 失败返回
29
- console.log("失败返回 ", "code:" + data.code + " message:" + data.message + " request_id:" + data.request_id)
29
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
30
30
  }
31
31
  })
32
32
  .catch((err) => {
@@ -43,19 +43,19 @@ h5usersign
43
43
  * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
44
44
  * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
45
45
  */
46
- request_id: "requestIdExample123456789",
47
- token: "55866120-532d-44dd-9251-cf453c7f4c63",
48
- color: "",
49
- url: "https://www.example.com",
50
- redirect_url: "https://www.example.com",
46
+ request_id: 'requestIdExample123456789',
47
+ token: '55866120-532d-44dd-9251-cf453c7f4c63',
48
+ color: '',
49
+ url: 'https://www.example.com',
50
+ redirect_url: 'https://www.example.com',
51
51
  })
52
52
  .then((data) => {
53
- if (data.code === "0000") {
53
+ if (data.code === '0000') {
54
54
  // 操作成功
55
- console.log("操作成功 ", data.data)
55
+ console.log('操作成功 ', data.data)
56
56
  } else {
57
57
  // 失败返回
58
- console.log("失败返回 ", "code:" + data.code + " message:" + data.message + " request_id:" + data.request_id)
58
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
59
59
  }
60
60
  })
61
61
  .catch((err) => {
@@ -72,19 +72,19 @@ h5usersign
72
72
  * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
73
73
  * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
74
74
  */
75
- request_id: "requestIdExample123456789",
75
+ request_id: 'requestIdExample123456789',
76
76
  dealer_id: config.dealer_id,
77
77
  broker_id: config.broker_id,
78
- real_name: "张三",
79
- id_card: "11010519491231002X",
78
+ real_name: '张三',
79
+ id_card: '11010519491231002X',
80
80
  })
81
81
  .then((data) => {
82
- if (data.code === "0000") {
82
+ if (data.code === '0000') {
83
83
  // 操作成功
84
- console.log("操作成功 ", data.data)
84
+ console.log('操作成功 ', data.data)
85
85
  } else {
86
86
  // 失败返回
87
- console.log("失败返回 ", "code:" + data.code + " message:" + data.message + " request_id:" + data.request_id)
87
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
88
88
  }
89
89
  })
90
90
  .catch((err) => {
@@ -101,20 +101,20 @@ h5usersign
101
101
  * 建议平台企业自定义 request-id,并记录在日志中,便于问题发现及排查
102
102
  * 如未自定义 request-id,将使用 SDK 中的 UUID 方法自动生成。注意:UUID 方法生成的 request-id 不能保证全局唯一,推荐自定义 request-id
103
103
  */
104
- request_id: "requestIdExample123456789",
104
+ request_id: 'requestIdExample123456789',
105
105
  dealer_id: config.dealer_id,
106
106
  broker_id: config.broker_id,
107
- real_name: "张三",
108
- id_card: "11010519491231002X",
107
+ real_name: '张三',
108
+ id_card: '11010519491231002X',
109
109
  certificate_type: 0,
110
110
  })
111
111
  .then((data) => {
112
- if (data.code === "0000") {
112
+ if (data.code === '0000') {
113
113
  // 操作成功
114
- console.log("操作成功 ", data.data)
114
+ console.log('操作成功 ', data.data)
115
115
  } else {
116
116
  // 失败返回
117
- console.log("失败返回 ", "code:" + data.code + " message:" + data.message + " request_id:" + data.request_id)
117
+ console.log('失败返回 ', 'code:' + data.code + ' message:' + data.message + ' request_id:' + data.request_id)
118
118
  }
119
119
  })
120
120
  .catch((err) => {