位置: 编程技术 - 正文

利用C/C++编写node.js原生模块的方法教程(c语言node定义)

编辑:rootadmin

推荐整理分享利用C/C++编写node.js原生模块的方法教程(c语言node定义),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:c++ nodejs,c++ nodejs,c++ node,node c语言,c++node类型,node c语言,c++node类型,node c语言,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

一直想了解一下使用C/C++编写nodejs原生模块,从网上找到的博客,大多都停留在如何搭建环境,然后一个Hello World完事。连更多的参考资料也没有。于是就自己整理了一下,分享于此。

至于准备环境什么的,网上一抓一大把,就不再详述 。

主要参考两个地方:

nodejs官方文档 v8文档

其中第一个是nodejs的官方文档,里面介绍了几个不错的参考例子。

第二个是v8引擎的文档,c++的,编写c++模块主要看这个文档。

好了,我们开始几个例子,逐步的了解如何使用c++编写nodejs模块。

Hello World

不能免俗,第一个先上来写个Hello World吧,毕竟程序员认识的第一个程序就是Hello World。

好了,这是最简单的一个HelloWorld,我们将文件命名为addon.cc,我们使用node-gyp编译一下,然后在我们的js文件中直接使用require引入模块,然后就可以调用了。

如无意外,将会在终端打印Hello World!。

我们简单来看一下代码,第一行#include <node.h>是C++中引入node.h头文件的代码。头文件可理解为接口,我们在里面只定义了接口方法,并未实现,然后通过其他文件实现,C++链接器负责将这两个链接在一起。

然后定义了一个方法hello() ,没有返回值。方法参数通过const v8::FunctionCallbackInfo<v8::Value> &args传递,注意,这里我们加了v8::前缀注解,也可以直接在文件开始使用using v8;这样就可以不用每次都使用这个注解了。

v8::Isolate *isolate = args.GetIsolate();这里,我们在函数中访问了javascript的作用域。

auto message = v8::String::NewFromUtf8(isolate, "Hello World!");我们创建了一个字符串类型的变量,赋值Hello World!并将其绑定到作用域。

我们通过args.GetReturnValue()获取了我们函数的返回值。

Initialize()方法用于初始化模块方法,将方法和要导出的模块的方法名进行绑定。

最后NODE_MODULE导出这个模块。

上面这个例子很简单,如果是js代码的话:

好了,第一个HelloWorld就结束了。网上很多介绍nodejs C++模块的博客文章,到这里就结束了。看完之后,一脸懵逼,啥啊这是?我想再写个传参数,并对参数做简单操作的方法该怎么写?

sum(a,b)

好吧。那我们就再写一个sum(a,b)函数,传递两个数字类型参数a,b,并求两个参数的和返回。

js中代码简单到下:

那么,C++该如何编写:

首先判断两个参数是否是Number类型,如果不是,直接抛出异常。如果是,则将返回值设置为两个参数的和。

这里我们并没有在参数列表中,直接使用a,b作为参数,而是直接使用 args 对象。 这和js是类似的,第一个参数是 args[0] ,第二个参数是 args[1] 。

调用IsNumber()来判断是否是数字类型。如果不是,抛出一个TypeError类型错误异常。如果类型没问题,使用args[0]->NumberValue()获取参数的数字值,然后相加,赋值给返回值。

可能你会问,args[0] 这是个啥?它的IsNumber()方法又是怎么来的?哪里有文档可以查阅呢?

这里其实是v8引擎内部类型,基本和js的内置对象是一一对应的。可以查阅v8类型说明文档。

上面这个图是不是很熟悉,和js的类型系统特别像。

js的Array,Date,Function,String等等都是继承自Object,而v8引擎内部,Object和Primitive都是继承自Value类型。

这里的IsNumber()方法就是Value类型的方法。那么除了这个方法,还有什么方法呢?

利用C/C++编写node.js原生模块的方法教程(c语言node定义)

上面这张图,我只是截了一小部分,全部的可以直接去查阅文档。看,这里有各种方法,判断是否是数字类型的IsNumber(),判断是否是日期类型的IsDate() ,判断是否是数组的IsArray()方法等等。

v8的接口实现的也很完善了,即使并不精通C++的开发者也可以照猫画虎的实现个简单的模块。

args[0]->NumberValue()返回的是一个double的值,是的,这里是实打实的C++里的double类型,可以直接进行加减运算的。类似的还有BooleanValue()方法等等,都是获取不同类型的值使用的方法。

第二个例子中,我们简单实现了一个sum()方法,传递两个参数,求和。但是这里涉及到的只是整型的值,那如果有其他类型的值怎么办呢?比如数组。

sumOfArray(array)

下面将方法升级一下,传递一个数组,然后求数组中所有值的和。js的话:

逻辑很简单,就是将传过来的数组进行遍历一遍,然后将所有项累加即可。C++也是如此:

先判断是否是数组,没什么问题。

然后我们定义了一个Object类型的received_v8_obj属性,将其赋值为args[0]->ToObject() 。这里调用ToObject()方法将其转换为一个对象。

然后调用这个对象的GetOwnPropertyNames()方法获取所有的键,然后根据键获取对象的值,进行累加。

为什么不直接将其转换为数组,然后进行遍历呢?

我们都知道,js中的数组并不是真正的数组,其实质还是对象。其内部都是键值对存储的。因此这里也是一样,Value类型并不提供直接转换为数组的ToArray()方法,而是将其转换为Object对象,通过对象的形式进行操作。

那么对象有哪些操作呢,看文档。

但是你会发现,v8确实有个Array类,继承自Object类。那么Array有什么方法呢?

看文档就知道了,少的可怜:

所以,对数组的操作都将转换为对象操作。

createObj()

说到对象了,那么我们就来写一个创建对象的方法。传递两个参数,一个name,一个age,创建一个对象,表示一个人,名叫啥,多大年纪。

这个方法,参照文档,基本没啥可说的。

通过Object::New(isolate)创建一个对象,然后设置两个属性name,age,将参数依次赋值给这两个属性,然后返回这个对象即可。

如果用js写:

callback

上面说的,都没提到js中一个重要的东西,回调函数。如果参数中传一个回调函数,那么我们该如何执行呢?

来一个简单的例子。

这个例子很简单,我们传两个数字类型参数a,b和一个回调函数fn,然后将a,b作为fn的参数调用fn回调函数。这里我们对a,b的操作转交给回调函数。回调函数里我们可以求和,也可以求积,随你。

这个例子中,暂时还没涉及到的是如何调用回调函数。

先上代码:

上面三个判断参数类型,略过。

我们定义一个Function类型属性jsfn,将args[2]强制转换为Function并赋值给jsfn。

然后定义一个具有两个值的参数argv,这两个值就是args[0] , args[1]的数字值。

然后通过jsfn->Call(Null(isolate),2,argv)调用回调函数。

argv是一个数组,其个数我们在定义时指定,2个。

Call()方法为函数类型的值进行调用的方法。

查阅文档,可以看出,Call()方法传3个参数,第一个参数是执行上下文,用于绑定代码执行时的this,第二个参数为参数个数,第三个为参数列表,数组形式。

上面几个例子,只是冰山一角,连一角都算不上。只为了解一下nodejs使用C/C++编写原生模块,如果要编写一个可用的,高性能的C模块,那么,要求程序员一定要精通C/C++,并且对js底层也很精通,包括v8和libuv等等。

总结

标签: c语言node定义

本文链接地址:https://www.jiuchutong.com/biancheng/382142.html 转载请保留说明!

上一篇:Node.js 回调函数实例详解(nodejs回调函数例子 getdata check)

下一篇:Nodejs之http的表单提交

  • 怎么算固定资产
  • 企业所得税怎么做账
  • 外经证先开票一直未预缴怎么办
  • 个体工商户的个税税率表
  • 二手车销售统一专票图片
  • 无形资产 减值
  • 公户转到老板私人账户
  • 合并报表编织原则
  • 税交多了退税走到哪一流程了问谁
  • 库存商品期末计量
  • 个人应纳税所得额 税率
  • 小规模纳税人查账征收所得税税率
  • 临时工工资个税怎么算
  • 年度账套怎么结转下一年
  • 投资收益税前扣除标准
  • 电子公章盖上去怎么文字看不到了
  • 二手车没购车发票有影响吗
  • 记账凭证中借方和贷方什么意思
  • 企业支付短期借款利息1000元
  • 资产总额小于所有者权益合计
  • 关于小微企业的规定
  • 增值税销项税额抵减账务处理
  • 工程已验收,质量问题怎么解决
  • 公司开业需要怎么布置
  • 法人变更涉及到什么
  • 期货保证金的计算公式当日盈亏怎么算
  • 契税计税依据是成交价还是评估价?
  • 搜索神器官网
  • 扣缴义务人应扣未扣如何处罚
  • 房产税城镇土地使用税申报期限
  • thinkphp教程
  • 七月份收入
  • d3.js下载
  • web网页设计期末作业猫眼电影首页
  • 公司有收入可不交社保吗
  • 企业提取盈余公积属于什么会计科目
  • 支付中间人佣金违法吗
  • 增值税普票遗失可否用复印件入账
  • mysql innodb存储结构
  • 经营所得预缴申报收入总额
  • sqlserver查询时报00bop错误
  • 个人所得税手续费返还增值税申报表怎么填
  • 哪种营业执照不用交税开店有营业执照有什么好
  • 小微企业能申请高新吗
  • 单位人民币卡账户的资金一律从其基本存款账户转账存入
  • 贴现凭证的分录
  • 成品油企业开具电票前还需要先进行库存下载吗
  • 如何区分借贷方和负债方
  • 先抵扣后付款怎么做账
  • 企业购手机的发票在哪里
  • 开了20万销项进项为0交多少税
  • 冲减应收账款是什么意思
  • 财务人员怎么查出发票虚开?
  • 公司变更地址后需要做哪些事情
  • MySQL 5.7双主同步部分表的实现过程详解
  • winxp系统怎么装
  • Mac OS X El Capitan公测版下载地址及安装教程图解
  • win8强制关闭程序
  • ubuntu误删除内核
  • win10预览版退回正式版
  • 删掉sam文件后无法开机
  • po|iceofficer是什么意思
  • linux安装yum命令步骤
  • win7怎么设置快
  • linux shell在while中用read从键盘输入的实现
  • 批处理中如何判断当前文件中是否存在一个子目录
  • 根据当前目录下的文件
  • 如何设置div自适应宽度
  • jquery操作checkbox火狐下第二次无法勾选的解决方法
  • 安卓版本apk
  • unity中物体移动代码
  • 简洁实用的公司治理机制
  • jquery基础知识梳理
  • 文化服务包括哪些专业
  • 建筑一般纳税人开3%
  • 给派出所写情况说明房屋情况怎么写啊
  • 加大税务稽查工作的建议
  • 武汉市第二税务稽查局地址
  • 个人所得税怎么申报
  • 金融机构不包括
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设