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

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

  • 详解Node.js API系列C/C++ Addons(1)
  • 详解Node.js API系列C/C++ Addons(2)
  • 详解Node.js API系列C/C++ Addons(3)
  • 《Node.js C++ addon编写实战(二)之对象转换》

直接上代码

#include 
#include 
#include 

using namespace v8;

void add(const FunctionCallbackInfo& 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 number = args[0]->ToObject();
   
   //Object类型是无法直接获取长度的,这里用一个转换来获取key数组,从而得到长度
   //而且args没有ToArray的方法
   Handle keys = number->GetOwnPropertyNames();
   int length = keys->Length();
   
   //执行算法
   int32_t sum = 0;
   for(int i=0;iGet(i)->Int32Value();
   }
   
   /*
   这里我尝试过两种返回的方法,宏NODE_SET_METHOD不支持有返回值的函数,只支持void类型(回调函数);
   同样,Target->Set()也只支持void类型的回调,因而不能用C++常规的返回。
   */
   args.GetReturnValue().Set(sum);
   //return Int32::New(isolate,sum);
}

//接下来就是常规流程了
void init_add(Handle 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++插件把数组元素相加,并返回。

你可能感兴趣的:(node.js)