簡體   English   中英

將任意Javascript數據對象傳遞給Node.js C ++插件

[英]Pass arbitrary Javascript data object to Node.js C++ addon

我有一個使用Nan用C ++編寫的Node.js插件。 工作非常好。 但是,我無法弄清楚如何讓我的Node Javascript代碼傳遞任意數據對象(例如{attr1:42, attr2:'hi', attr3:[5,4,3,2,1]} )到C ++插件。

到目前為止,我通過在我的數據對象上調用JSON.stringify()然后在C ++端解析字符串化的JSON來解決這個問題。

理想情況下,我想避免復制數據,只是獲取對我可以訪問的數據對象的引用,或者至少本地復制它並避免字符串化/解析...

任何幫助,將不勝感激!

您可以允許Node.js c ++插件采用任意類型的參數,但必須明確檢查和處理類型。 他是一個簡單的示例函數,展示了如何執行此操作:

void args(const Nan::FunctionCallbackInfo<v8::Value>& info) {

    int i = 0;
    while (i < info.Length()) {
        if (info[i]->IsBoolean()) {
            printf("boolean = %s", info[i]->BooleanValue() ? "true" : "false");
        } else if (info[i]->IsInt32()) {
            printf("int32 = %ld", info[i]->IntegerValue());
        } else if (info[i]->IsNumber()) {
            printf("number = %f", info[i]->NumberValue());
        } else if (info[i]->IsString()) {
            printf("string = %s", *v8::String::Utf8Value(info[i]->ToString()));
        } else if (info[i]->IsObject()) {
            printf("[object]");
            v8::Local<v8::Object> obj = info[i]->ToObject();
            v8::Local<v8::Array> props = obj->GetPropertyNames();
            for (unsigned int j = 0; j < props->Length(); j++) {
                printf("%s: %s",
                       *v8::String::Utf8Value(props->Get(j)->ToString()),
                       *v8::String::Utf8Value(obj->Get(props->Get(j))->ToString())
                      );
            }
        } else if (info[i]->IsUndefined()) {
            printf("[undefined]");
        } else if (info[i]->IsNull()) {
            printf("[null]");
        }
        i += 1;
    }
}

為了實際解決處理可能包含具有任意數據的對象的任意參數的問題,我建議編寫一個解析實際對象的函數,類似於我在此示例中解析函數參數的方式。 請記住,如果您希望能夠處理對象中的嵌套對象,則可能需要遞歸執行此操作。

您不必將對象字符串化以將其傳遞給c ++插件。 有接受這些仲裁對象的方法。 但它不是那么隨意。 您必須編寫不同的代碼來解析c ++中的對象。 將其視為數據庫的模式。 您無法在單個集合/表中保存不同的格式數據。 您將需要具有特定架構的另一個表/集合。

我們來看看這個例子:

我們將對象{x:10,y:5}傳遞給addon,c ++ addon將返回另一個對象,其中包含屬性的sum和product,如下所示:{x1:15,y1:50}

在cpp代碼中:

NAN_METHOD(func1) {
        if (info.Length() > 0) {
                Local<Object> obj = info[0]->ToObject();
                Local<String> x = Nan::New<String>("x").ToLocalChecked();
                Local<String> y = Nan::New<String>("y").ToLocalChecked();

                Local<String> sum  = Nan::New<String>("sum").ToLocalChecked();
                Local<String> prod  = Nan::New<String>("prod").ToLocalChecked();

                Local<Object> ret = Nan::New<Object>();

                double x1 = Nan::Get(obj, x).ToLocalChecked()->NumberValue();
                double y1 = Nan::Get(obj, y).ToLocalChecked()->NumberValue();

                Nan::Set(ret, sum, Nan::New<Number>(x1 + y1));
                Nan::Set(ret, prod, Nan::New<Number>(x1 * y1));

                info.GetReturnValue().Set(ret);

        }
}

在javascript ::

const addon = require('./build/Release/addon.node');
var obj = addon.func1({ 'x': 5, 'y': 10 });
console.log(obj); // { sum: 15, prod: 50 }

在這里,您只能將{x: (Number), y: (number)}類型對象僅發送到插件。 否則它將無法解析或檢索數據。

像這樣的數組:

在cpp中:

NAN_METHOD(func2) {
    Local<Array> array = Local<Array>::Cast(info[0]);

    Local<String> ss_prop = Nan::New<String>("sum_of_squares").ToLocalChecked();
    Local<Array> squares = New<v8::Array>(array->Length());
    double ss = 0;

    for (unsigned int i = 0; i < array->Length(); i++ ) {
      if (Nan::Has(array, i).FromJust()) {
        // get data from a particular index
        double value = Nan::Get(array, i).ToLocalChecked()->NumberValue();

        // set a particular index - note the array parameter
        // is mutable
        Nan::Set(array, i, Nan::New<Number>(value + 1));
        Nan::Set(squares, i, Nan::New<Number>(value * value));
        ss += value*value;
      }
    }
    // set a non index property on the returned array.
    Nan::Set(squares, ss_prop, Nan::New<Number>(ss));
    info.GetReturnValue().Set(squares);
}

在javascript中:

const addon = require('./build/Release/addon.node');
var arr = [1, 2, 3];
console.log(addon.func2(arr));  //[ 1, 4, 9, sum_of_squares: 14 ]

像這樣,您可以處理數據類型。 如果需要復雜的對象或操作,只需在一個函數中混合使用這些方法並解析數據即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM