• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "cJsonNapiH/cjsonnapi.h"
17 
getCjsonChildOut2(napi_env env,napi_value childOut,cJSON * jsonChild)18 napi_value getCjsonChildOut2(napi_env env, napi_value childOut, cJSON *jsonChild)
19 {
20     napi_status status;
21     const napi_extended_error_info *extended_error_info;
22     const char *tag = "[KH418_CJSON_Parse]";
23     napi_value childTypeOut;
24     status = napi_create_int32(env, jsonChild->type, &childTypeOut);
25     if (status != napi_ok) {
26         getErrMessage(status, env, extended_error_info, "napi_create_int32 jsonChild->type", tag);
27         return nullptr;
28     }
29     status = napi_set_named_property(env, childOut, "type", childTypeOut);
30     if (status != napi_ok) {
31         getErrMessage(status, env, extended_error_info, "napi_set_named_property jsonChild->type", tag);
32         return nullptr;
33     }
34     napi_value childValueintOut;
35     status = napi_create_int32(env, jsonChild->valueint, &childValueintOut);
36     if (status != napi_ok) {
37         getErrMessage(status, env, extended_error_info, "napi_create_int32 jsonChild->valueint", tag);
38         return nullptr;
39     }
40     status = napi_set_named_property(env, childOut, "valueint", childValueintOut);
41     if (status != napi_ok) {
42         getErrMessage(status, env, extended_error_info, "napi_set_named_property jsonChild->valueint", tag);
43         return nullptr;
44     }
45     napi_value childValuedoubleOut;
46     status = napi_create_double(env, jsonChild->valuedouble, &childValuedoubleOut);
47     if (status != napi_ok) {
48         getErrMessage(status, env, extended_error_info, "napi_create_double jsonChild->valuedouble", tag);
49         return nullptr;
50     }
51     status = napi_set_named_property(env, childOut, "valuedouble", childValuedoubleOut);
52     if (status != napi_ok) {
53         getErrMessage(status, env, extended_error_info, "napi_set_named_property jsonChild->valuedouble", tag);
54         return nullptr;
55     }
56     return childOut;
57 }
58 
getCjsonChildOut(napi_env env,napi_value childOut,cJSON * jsonChild)59 napi_value getCjsonChildOut(napi_env env, napi_value childOut, cJSON *jsonChild)
60 {
61     napi_status status;
62     const napi_extended_error_info *extended_error_info;
63     const char *tag = "[KH418_CJSON_Parse]";
64     // 将数据塞入child
65     if (jsonChild != nullptr) {
66         napi_value childValuestringOut;
67         status = napi_create_string_utf8(env, jsonChild->valuestring == nullptr ? "" : jsonChild->valuestring,
68                                          NAPI_AUTO_LENGTH, &childValuestringOut);
69         if (status != napi_ok) {
70             getErrMessage(status, env, extended_error_info, "napi_create_string_utf8 jsonChild->valuestring", tag);
71             return nullptr;
72         }
73         status = napi_set_named_property(env, childOut, "valuestring", childValuestringOut);
74         if (status != napi_ok) {
75             getErrMessage(status, env, extended_error_info, "napi_set_named_property jsonChild->valuestring", tag);
76             return nullptr;
77         }
78         napi_value childStringOut;
79         status = napi_create_string_utf8(env, jsonChild->string == nullptr ? "" : jsonChild->string, NAPI_AUTO_LENGTH,
80                                          &childStringOut);
81         if (status != napi_ok) {
82             getErrMessage(status, env, extended_error_info, "napi_create_string_utf8 jsonChild->string", tag);
83             return nullptr;
84         }
85         status = napi_set_named_property(env, childOut, "string", childStringOut);
86         if (status != napi_ok) {
87             getErrMessage(status, env, extended_error_info, "napi_set_named_property jsonChild->string", tag);
88             return nullptr;
89         }
90         childOut = getCjsonChildOut2(env, childOut, jsonChild);
91     }
92     return childOut;
93 }
94 
getCjsonNextOut2(napi_env env,napi_value nextOut,cJSON * jsonNext)95 napi_value getCjsonNextOut2(napi_env env, napi_value nextOut, cJSON *jsonNext)
96 {
97     napi_status status;
98     const napi_extended_error_info *extended_error_info;
99     const char *tag = "[KH418_CJSON_Parse]";
100     napi_value nextTypeOut;
101     status = napi_create_int32(env, jsonNext->type, &nextTypeOut);
102     if (status != napi_ok) {
103         getErrMessage(status, env, extended_error_info, "napi_create_int32 jsonNext->type", tag);
104         return nullptr;
105     }
106     status = napi_set_named_property(env, nextOut, "type", nextTypeOut);
107     if (status != napi_ok) {
108         getErrMessage(status, env, extended_error_info, "napi_set_named_property jsonNext->type", tag);
109         return nullptr;
110     }
111     napi_value nextValueintOut;
112     status = napi_create_int32(env, jsonNext->valueint, &nextValueintOut);
113     if (status != napi_ok) {
114         getErrMessage(status, env, extended_error_info, "napi_create_int32 jsonNext->valueint", tag);
115         return nullptr;
116     }
117     status = napi_set_named_property(env, nextOut, "valueint", nextValueintOut);
118     if (status != napi_ok) {
119         getErrMessage(status, env, extended_error_info, "napi_set_named_property jsonNext->valueint", tag);
120         return nullptr;
121     }
122     napi_value nextValuedoubleOut;
123     status = napi_create_double(env, jsonNext->valuedouble, &nextValuedoubleOut);
124     if (status != napi_ok) {
125         getErrMessage(status, env, extended_error_info, "napi_create_double jsonNext->valuedouble", tag);
126         return nullptr;
127     }
128     status = napi_set_named_property(env, nextOut, "valuedouble", nextValuedoubleOut);
129     if (status != napi_ok) {
130         getErrMessage(status, env, extended_error_info, "napi_set_named_property jsonNext->valuedouble", tag);
131         return nullptr;
132     }
133     return nextOut;
134 }
135 
getCjsonNextOut(napi_env env,napi_value nextOut,cJSON * jsonNext)136 napi_value getCjsonNextOut(napi_env env, napi_value nextOut, cJSON *jsonNext)
137 {
138     napi_status status;
139     const napi_extended_error_info *extended_error_info;
140     const char *tag = "[KH418_CJSON_Parse]";
141     // 将数据塞入next
142     if (jsonNext != nullptr) {
143         napi_value nextValuestringOut;
144         status = napi_create_string_utf8(env, jsonNext->valuestring == nullptr ? "" : jsonNext->valuestring,
145                                          NAPI_AUTO_LENGTH, &nextValuestringOut);
146         if (status != napi_ok) {
147             getErrMessage(status, env, extended_error_info, "napi_create_string_utf8 jsonNext->valuestring", tag);
148             return nullptr;
149         }
150         status = napi_set_named_property(env, nextOut, "valuestring", nextValuestringOut);
151         if (status != napi_ok) {
152             getErrMessage(status, env, extended_error_info, "napi_set_named_property jsonNext->valuestring", tag);
153             return nullptr;
154         }
155         napi_value nextStringOut;
156         status = napi_create_string_utf8(env, jsonNext->string == nullptr ? "" : jsonNext->string, NAPI_AUTO_LENGTH,
157                                          &nextStringOut);
158         if (status != napi_ok) {
159             getErrMessage(status, env, extended_error_info, "napi_create_string_utf8 jsonNext->string", tag);
160             return nullptr;
161         }
162         status = napi_set_named_property(env, nextOut, "string", nextStringOut);
163         if (status != napi_ok) {
164             getErrMessage(status, env, extended_error_info, "napi_set_named_property jsonNext->string", tag);
165             return nullptr;
166         }
167         nextOut = getCjsonNextOut2(env, nextOut, jsonNext);
168     }
169     return nextOut;
170 }
171 
getCjsonparseInfo(napi_env env,napi_value objIn)172 char *getCjsonparseInfo(napi_env env, napi_value objIn)
173 {
174     napi_status status;
175     const napi_extended_error_info *extended_error_info;
176     const char *tag = "[KH418_CJSON_Parse]";
177     /* [NAPI_GEN]: 从args数组中获取入参 */
178     napi_valuetype valuetypevalue;
179     /* [NAPI_GEN]: 获取入参类型,第0个入参
180      * env: N-API环境的句柄,表示当前的上下文
181      * value: 要检查类型的js值
182      * result: 是一个指针,指向napi_valuetype枚举的值,函数会将结果存储在这里
183      */
184     status = napi_typeof(env, objIn, &valuetypevalue);
185     if (status != napi_ok) {
186         getErrMessage(status, env, extended_error_info, "napi_typeof", tag);
187         return nullptr;
188     }
189     size_t strSize0 = 0;
190     /* [NAPI_GEN]: napi_get_value_string_utf8用于将Js字符串转换为UTF-8编码的C字符串
191      * env: N-API环境的句柄,表示当前的上下文
192      * value: 要转换的JavaScript字符串
193      * buf: 用于存储结果的字符数组的指针
194      * bufsize: 缓冲区大小,以字节为单位
195      * result: 转换后的字符串的字节长度(不包括空终止符)。若干buf是NULL,则返回所需的缓冲区大小(包括空终止符)
196      */
197     /* [NAPI_GEN]: buf参数是NULL时,用于获取所需缓冲区大小*/
198     status = napi_get_value_string_utf8(env, objIn, NULL, 0, &strSize0);
199     if (status != napi_ok) {
200         getErrMessage(status, env, extended_error_info, "get value string", tag);
201         return nullptr;
202     }
203     char *valueIn = new char[strSize0 + 1];
204     /* [NAPI_GEN]: 用于获取字符串*/
205     status = napi_get_value_string_utf8(env, objIn, valueIn, strSize0 + 1, &strSize0);
206     if (status != napi_ok) {
207         getErrMessage(status, env, extended_error_info, "get value string", tag);
208         delete[] valueIn;
209         return nullptr;
210     }
211     return valueIn;
212 }
213 
getCjsonparseOut1(napi_env env,cJSON * jsonNext,napi_value cJSON_ParseOut)214 napi_value getCjsonparseOut1(napi_env env, cJSON *jsonNext, napi_value cJSON_ParseOut)
215 {
216     napi_status status;
217     const napi_extended_error_info *extended_error_info;
218     const char *tag = "[KH418_CJSON_Parse]";
219     napi_value nextOut;
220     /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
221      * env: 当前环境的句柄
222      * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
223      */
224     status = napi_create_object(env, &nextOut);
225     if (status != napi_ok) {
226         getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
227         return nullptr;
228     }
229     nextOut = getCjsonNextOut(env, nextOut, jsonNext);
230     /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
231      * env: 当前环境的句柄
232      * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
233      * utf8name: 属性的名称,是一个以UTF-8编码的字符串
234      * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
235      */
236     status = napi_set_named_property(env, cJSON_ParseOut, "next", nextOut);
237     if (status != napi_ok) {
238         /* [NAPI_GEN]: 错误处理*/
239         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
240         return nullptr;
241     }
242     napi_value prevOut;
243     /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
244      * env: 当前环境的句柄
245      * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
246      */
247     status = napi_create_object(env, &prevOut);
248     if (status != napi_ok) {
249         getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
250         return nullptr;
251     }
252     /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
253      * env: 当前环境的句柄
254      * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
255      * utf8name: 属性的名称,是一个以UTF-8编码的字符串
256      * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
257      */
258     status = napi_set_named_property(env, cJSON_ParseOut, "prev", prevOut);
259     if (status != napi_ok) {
260         /* [NAPI_GEN]: 错误处理*/
261         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
262         return nullptr;
263     }
264     return cJSON_ParseOut;
265 }
266 
getCjsonparseOut2(napi_env env,cJSON * json,cJSON * jsonChild,napi_value cJSON_ParseOut)267 napi_value getCjsonparseOut2(napi_env env, cJSON *json, cJSON *jsonChild, napi_value cJSON_ParseOut)
268 {
269     napi_status status;
270     const napi_extended_error_info *extended_error_info;
271     const char *tag = "[KH418_CJSON_Parse]";
272     napi_value childOut;
273     /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
274      * env: 当前环境的句柄
275      * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
276      */
277     status = napi_create_object(env, &childOut);
278     if (status != napi_ok) {
279         getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
280         return nullptr;
281     }
282     childOut = getCjsonChildOut(env, childOut, jsonChild);
283     /* [NAPI_GEN]:
284      * 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js env:
285      * 当前环境的句柄 object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 utf8name:
286      * 属性的名称,是一个以UTF-8编码的字符串 value:
287      * 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
288      */
289     status = napi_set_named_property(env, cJSON_ParseOut, "child", childOut);
290     if (status != napi_ok) {
291         /* [NAPI_GEN]: 错误处理*/
292         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
293         return nullptr;
294     }
295     napi_value typeOut;
296     /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象
297      * env: 当前环境的句柄
298      * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
299      * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
300      */
301     status = napi_create_int32(env, json == nullptr ? 0 : json->type, &typeOut);
302     if (status != napi_ok) {
303         getErrMessage(status, env, extended_error_info, "napi_create_int32", tag);
304         return nullptr;
305     }
306     /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
307      * env: 当前环境的句柄
308      * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
309      * utf8name: 属性的名称,是一个以UTF-8编码的字符串
310      * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
311      */
312     status = napi_set_named_property(env, cJSON_ParseOut, "type", typeOut);
313     if (status != napi_ok) {
314         /* [NAPI_GEN]: 错误处理*/
315         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
316         return nullptr;
317     }
318     return cJSON_ParseOut;
319 }
320 
getCjsonparseOut3(napi_env env,cJSON * json,napi_value cJSON_ParseOut)321 napi_value getCjsonparseOut3(napi_env env, cJSON *json, napi_value cJSON_ParseOut)
322 {
323     napi_status status;
324     const napi_extended_error_info *extended_error_info;
325     const char *tag = "[KH418_CJSON_Parse]";
326     napi_value valuestringOut;
327     /* [NAPI_GEN]:
328      * 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串
329      * env: 当前环境的句柄
330      * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以valuestring举例,用户可根据需求修改
331      * length:
332      * 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
333      * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
334      */
335     status =
336         napi_create_string_utf8(env, json == nullptr ? "" : (json->valuestring == nullptr ? "" : json->valuestring),
337                                 NAPI_AUTO_LENGTH, &valuestringOut);
338     if (status != napi_ok) {
339         /*错误处理*/
340         getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag);
341         return nullptr;
342     }
343     /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
344      * env: 当前环境的句柄
345      * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
346      * utf8name: 属性的名称,是一个以UTF-8编码的字符串
347      * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
348      */
349     status = napi_set_named_property(env, cJSON_ParseOut, "valuestring", valuestringOut);
350     if (status != napi_ok) {
351         /* [NAPI_GEN]: 错误处理*/
352         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
353         return nullptr;
354     }
355     napi_value valueintOut;
356     /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象
357      * env: 当前环境的句柄
358      * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
359      * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
360      */
361     status = napi_create_int32(env, json == nullptr ? 0 : json->valueint, &valueintOut);
362     if (status != napi_ok) {
363         getErrMessage(status, env, extended_error_info, "napi_create_int32", tag);
364         return nullptr;
365     }
366     /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
367      * env: 当前环境的句柄
368      * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
369      * utf8name: 属性的名称,是一个以UTF-8编码的字符串
370      * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
371      */
372     status = napi_set_named_property(env, cJSON_ParseOut, "valueint", valueintOut);
373     if (status != napi_ok) {
374         /* [NAPI_GEN]: 错误处理*/
375         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
376         return nullptr;
377     }
378     return cJSON_ParseOut;
379 }
380 
getCjsonparseOut4(napi_env env,cJSON * json,napi_value cJSON_ParseOut)381 napi_value getCjsonparseOut4(napi_env env, cJSON *json, napi_value cJSON_ParseOut)
382 {
383     napi_status status;
384     const napi_extended_error_info *extended_error_info;
385     const char *tag = "[KH418_CJSON_Parse]";
386     napi_value valuedoubleOut;
387     /* [NAPI_GEN]: 返回值是double类型时,napi_create_double 创建一个包含双精度浮点数的js数值(Number)对象
388      * env: 当前环境的句柄
389      * value: 要传递给js的双精度浮点数值,这里以传入1.0为例,用例新增业务代码时可根据自身需求修改
390      * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
391      */
392     status = napi_create_double(env, json == nullptr ? 0 : json->valuedouble, &valuedoubleOut);
393     if (status != napi_ok) {
394         getErrMessage(status, env, extended_error_info, "napi_create_double", tag);
395         return nullptr;
396     }
397     /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
398      * env: 当前环境的句柄
399      * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
400      * utf8name: 属性的名称,是一个以UTF-8编码的字符串
401      * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
402      */
403     status = napi_set_named_property(env, cJSON_ParseOut, "valuedouble", valuedoubleOut);
404     if (status != napi_ok) {
405         /* [NAPI_GEN]: 错误处理*/
406         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
407         return nullptr;
408     }
409     napi_value stringOut;
410     /* [NAPI_GEN]:
411      * 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串
412      * env: 当前环境的句柄
413      * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以string举例,用户可根据需求修改
414      * length:
415      * 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
416      * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
417      */
418     status = napi_create_string_utf8(env, json == nullptr ? "" : (json->string == nullptr ? "" : json->string),
419                                      NAPI_AUTO_LENGTH, &stringOut);
420     if (status != napi_ok) {
421         /*错误处理*/
422         getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag);
423         return nullptr;
424     }
425     /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
426      * env: 当前环境的句柄
427      * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
428      * utf8name: 属性的名称,是一个以UTF-8编码的字符串
429      * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
430      */
431     status = napi_set_named_property(env, cJSON_ParseOut, "string", stringOut);
432     if (status != napi_ok) {
433         /* [NAPI_GEN]: 错误处理*/
434         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
435         return nullptr;
436     }
437     return cJSON_ParseOut;
438 }
439 
440 /* [NAPI_GEN]: 对应cJSON.h中: CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);的napi方法,
441  * param: name: string; type: const char * 输入一个待转换的字符串
442  * out: 输出cJSON序列化之后的字符串
443  */
KH418_CJSON_Parse(napi_env env,napi_callback_info info)444 napi_value KH418_CJSON_Parse(napi_env env, napi_callback_info info)
445 {
446     napi_status status;
447     /* [NAPI_GEN]: Node.js在其N-API中用来提供错误的扩展信息的结构体,结构体包含以下字段
448      * error_message: 一个指向错误详细字符串的指针,提供了关于错误的文本描述
449      * engin_reserved: 一个保留给Js引擎使用的指针
450      * error_code: 错误码,指示了错误的种类,比如napi_pending_exception表示有一个JavaScript异常未被清理。
451      * engine_error_code:一个引擎特定的错误码,为引擎实现保留,具体含义依赖于使用的JavaScript引擎。
452      * error_message_len:错误消息字符串的长度。
453      */
454     const napi_extended_error_info *extended_error_info;
455     /* [NAPI_GEN]: tag: 日志打印标签*/
456     const char *tag = "[KH418_CJSON_Parse]";
457     /* [NAPI_GEN]: get function param in*/
458     /* [NAPI_GEN]: argc:js传入的参数个数 */
459     size_t argc = PARAMS1;
460     /* [NAPI_GEN]: args: 一个数组,保存js传入的参数 */
461     napi_value args[PARAMS1] = {nullptr};
462     /* [NAPI_GEN]: napi_get_cb_info用于获取JS调用该函数时所传递的参数、接收参数的个数以及'this'的值
463      * env: 当前环境的句柄,代表当前的Node.js环境
464      * info: 回调信息句柄,代表当前回调的上下文
465      * argc: 指向size_t的指针,最初应包含可接受的最大参数数量,函数返回时,它将包含实际传递的参数数量
466      * args: 一个足够大的数组,用于接收传递给回调函数的所有js参数。数组的大小应至少与argc传入的值一样大。
467      * this_arg: 如果不是NULL,则返回js回调中this的值
468      * data: 如果不是NULL,则返回与回调函数关联的任何可选数据。通常用于传递在创建函数时指定的静态数据
469      */
470     status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
471     if (status != napi_ok) {
472         /* [NAPI_GEN]: 错误处理*/
473         getErrMessage(status, env, extended_error_info, "napi_get_cb_info", tag);
474         return nullptr;
475     }
476     napi_value obj = args[0];
477     char *valueIn = getCjsonparseInfo(env, obj);
478     // Todo: add business logic. 在这前后代码为框架所生成
479     cJSON *json = cJSON_Parse(valueIn);
480     if (json == nullptr) {
481         return nullptr;
482     }
483     cJSON *jsonChild = nullptr;
484     if (json != nullptr) {
485         jsonChild = json->child;
486     }
487     cJSON *jsonNext = nullptr;
488     if (jsonChild != nullptr) {
489         jsonNext = jsonChild->next;
490     }
491 
492     delete[] valueIn;
493     /* [NAPI_GEN]: function return value*/
494     napi_value cJSON_ParseOut;
495     /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
496      * env: 当前环境的句柄
497      * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
498      */
499     status = napi_create_object(env, &cJSON_ParseOut);
500     if (status != napi_ok) {
501         getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
502         return nullptr;
503     }
504 
505     cJSON_ParseOut = getCjsonparseOut1(env, jsonNext, cJSON_ParseOut);
506     cJSON_ParseOut = getCjsonparseOut2(env, json, jsonChild, cJSON_ParseOut);
507     cJSON_ParseOut = getCjsonparseOut3(env, json, cJSON_ParseOut);
508     cJSON_ParseOut = getCjsonparseOut4(env, json, cJSON_ParseOut);
509 
510     cJSON_Delete(json);
511     return cJSON_ParseOut;
512 }
513