经过前天的铺垫,对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++插件把数组元素相加,并返回。