勤学勤记——node.js的C++addon(二)

经过前天的铺垫,对Node.js的C++插件有了大致的了解,但是也留下了不少问题:传入的参数该如何使用?函数的返回结果?等等问题。
本来想着跟v8文档死磕,不过还是感谢大佬的博客,让我节省了不少时间,少走弯路:

直接上代码

#include <node.h>
#include <v8.h>
#include <stdio.h>

using namespace v8;

void add(const FunctionCallbackInfo<Value>& args){
    //获取一个v8实体
    Isolate* isolate = args.GetIsolate();
    //参数检验
   if(args.Length()<1){
       isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate,"First argument must be number!")));
       return;
   }
   
   //JS中的数组是Object,这里用Object来保存参数中的数组
   Local<Object> number = args[0]->ToObject();
   
   //Object类型是无法直接获取长度的,这里用一个转换来获取key数组,从而得到长度
   //而且args没有ToArray的方法
   Handle<Array> keys = number->GetOwnPropertyNames();
   int length = keys->Length();
   
   //执行算法
   int32_t sum = 0;
   for(int i=0;i<length;i++){
       sum+=number->Get(i)->Int32Value();
   }
   
   /*
   这里我尝试过两种返回的方法,宏NODE_SET_METHOD不支持有返回值的函数,只支持void类型(回调函数);
   同样,Target->Set()也只支持void类型的回调,因而不能用C++常规的返回。
   */
   args.GetReturnValue().Set(sum);
   //return Int32::New(isolate,sum);
}

//接下来就是常规流程了
void init_add(Handle<Object> target){
    Isolate* isolate = target->GetIsolate();
    NODE_SET_METHOD(target,"Add",add);
    //target->Set(String::NewFromUtf8(isolate,"Add"),FunctionTemplate::New(isolate,add));
}
NODE_MODULE(binding,init_add);

以上代码实现了从JS中传入一个数组,利用C++插件把数组元素相加,并返回。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值