上一讲讲了如何通过nodejs搭建编译环境,这一讲我们要说说如何返回特定的nodejs对象作为返回。
从这一讲开始,大家要经常看nodejs的官方文档---传送门。先给大家讲讲如何通过C语言组合成nodejs的对象。
首先从一个简单的对象开始:
{ ID:1, name:'jevian', sex:'man' }
这是一个很简单的属性对象,如果是nodejs,可以说一句话就实现了。但是用C会麻烦很多。
需要下面几个操作。
napi_value ID; napi_create_int32(env, 1, &ID); napi_value name; napi_create_string_utf8(env, "jevian", NAPI_AUTO_LENGTH, &name); napi_value sex; napi_create_string_utf8(env, "man", NAPI_AUTO_LENGTH, &sex); napi_value obj; napi_create_object (env, &obj); napi_set_named_property (env, obj, "ID", ID); napi_set_named_property (env, obj, "name", name); napi_set_named_property (env, obj, "sex", sex);
可以看见,javascript一句话可以完成的事情,使用C语言要11句话。最后生成的obj对象就是我们想要的。
这个案例很简单,其中的obj是单层的,不是混合模式的。
下面看另一个案例,双层的对象:
{ ID:1, msg: { name: 'jevian', sex: 'man' } }
实现这个的方式会稍微麻烦一点,方法如下:
napi_value ID; napi_create_int32(env, 1, &ID); napi_value name; napi_create_string_utf8(env, "jevian", NAPI_AUTO_LENGTH, &name); napi_value sex; napi_create_string_utf8(env, "man", NAPI_AUTO_LENGTH, &sex); napi_value msg; napi_create_object (env, &msg); napi_set_named_property (env, msg, "name", name); napi_set_named_property (env, msg, "sex", sex); napi_value obj; napi_create_object (env, &obj); napi_set_named_property (env, obj, "ID", ID); napi_set_named_property (env, obj, "msg", msg);
大家看见没,需要先建立一个msg变量,然后将name与sex包入,最后将msg包入obj。所以说虽然C语言的性能好,但是开发体验并不好。
下面再介绍大家数组如何实现,数组如下:
['worldflying', 50, 'hello', 1 , {ID: 1, name: 'jevian'}]
这上面的数组元素是一个混合对象,最复杂的对象应该也不过如此吧,实现方式如下:
napi_value ID; napi_create_int32(env, 1, &ID); napi_value name; napi_create_string_utf8(env, "jevian", NAPI_AUTO_LENGTH, &name); napi_value obj; napi_create_object (env, &obj); napi_set_named_property (env, obj, "ID", ID); napi_set_named_property (env, obj, "name", name); napi_value arr1; napi_create_string_utf8(env, "worldflying", NAPI_AUTO_LENGTH, &arr1); napi_value arr2; napi_create_int32(env, 50, &arr2); napi_value arr3; napi_create_string_utf8(env, "hello", NAPI_AUTO_LENGTH, &arr3); napi_value arr4; napi_create_int32(env, 1, &arr4); napi_value arr; napi_create_array(env, &arr); napi_set_element(env, arr, 0, arr1); napi_set_element(env, arr, 1, arr2); napi_set_element(env, arr, 2, arr3); napi_set_element(env, arr, 3, arr4); napi_set_element(env, arr, 4, obj);
这里我借用下昨天的案例,完整的C语言代码如下:
#include <stdio.h> #include <node_api.h> napi_value ShowVersion(napi_env env, napi_callback_info info) { napi_value ID; napi_create_int32(env, 1, &ID); napi_value name; napi_create_string_utf8(env, "jevian", NAPI_AUTO_LENGTH, &name); napi_value obj; napi_create_object (env, &obj); napi_set_named_property (env, obj, "ID", ID); napi_set_named_property (env, obj, "name", name); napi_value arr1; napi_create_string_utf8(env, "worldflying", NAPI_AUTO_LENGTH, &arr1); napi_value arr2; napi_create_int32(env, 50, &arr2); napi_value arr3; napi_create_string_utf8(env, "hello", NAPI_AUTO_LENGTH, &arr3); napi_value arr4; napi_create_int32(env, 1, &arr4); napi_value arr; napi_create_array(env, &arr); napi_set_element(env, arr, 0, arr1); napi_set_element(env, arr, 1, arr2); napi_set_element(env, arr, 2, arr3); napi_set_element(env, arr, 3, arr4); napi_set_element(env, arr, 4, obj); return arr; } napi_value Init(napi_env env, napi_value exports) { napi_value fn; if (napi_create_function(env, NULL, 0, ShowVersion, NULL, &fn) != napi_ok) return NULL; if (napi_set_named_property(env, exports, "ShowVersion", fn) != napi_ok) return NULL; return exports; } NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
调用的代码如下:
let ts = require('./test.node') let res = ts.ShowVersion() console.log (res)
返回的值就可以像一个普通的nodejs代码一样调用了。
调用结果如下:
F:\BaiduYunDownload\nodetest>node test.js
[ 'worldflying', 50, 'hello', 1, { ID: 1, name: 'jevian' } ]
文章作者:沃航科技