Konvertieren von v8 :: Argumente in C ++ Typen

Ich spiele mit dem Erstellen von Node.js-Modulen in C ++, aber ich bin ratlos in der v8 :: Arguments-class. Nehmen wir an, ich habe eine Javascript-class zum Senden von E-Mails, die eine Methode mit dieser Signatur hat:

Mailer::sendEmail(Array recipients, String sender, String message); 

Was würde so genannt werden:

 mailer.sendEmail(["joe@gmail.com", "sally@gmail.com"], "fred@gmail.com", "Hi there"); 

Jetzt in C ++ Land, habe ich eine classnfunktion mit dieser Signatur:

 SendEmail(const v8::Arguments& args) 

Welche unterstützt meine Mailer :: sendEmail Methode in Javascript Land. Die SendEmail-function erstellt eine neue Instanz meiner Emailer-class, die selbst eine classnfunktion mit dieser Signatur hat:

 send(std::list recipients, std::string from, std::string message) 

Und hier bin ich verloren. Ich weiß nicht, wie man die Werte von args nimmt und in reguläre C ++ – Typen umwandelt, damit ich die Werte an meine Sendefunktion übergeben kann. Wie ich es verstehe, sind die 3 Werte, die an Mailer :: sendEmail übergeben werden, in args [0] , args [1] und args [2] verfügbar. Ich verstehe sogar, dass ich eine Typüberprüfung machen kann wie if (!args[0]->IsArray()) , aber tatsächlich das Konvertieren von args [0] in std::list ist was ich nicht weiß wie machen.

Edit: Ich fand einen hackischen Weg, dies zu tun, aber ich denke immer noch, dass V8 einige eingebaute Methoden hat, um das auf eine sauberere Art zu handhaben.

 static Handle SendEmail(const Arguments& args) { HandleScope scope; list values; Local obj = args[0]->ToObject(); Local props = obj->GetPropertyNames(); // Iterate through args[0], adding each element to our list for(unsigned int i = 0; i Length(); i++) { String::AsciiValue val(obj->Get(i)->ToString()); values.push_front(string(*val)); } // Display the values in the list for debugging purposes for (list::iterator it = values.begin(); it != values.end(); it++) { cout << *it << endl; } return scope.Close(args.This()); } 

Ich weiß, dass dies ein älteres Thema ist, aber ich tendiere dazu wie folgt:

 Handle MethodName (const Arguments& args) { // get the param v8::String::Utf8Value param1(args[0]->ToString()); // convert it to string std::string foo = std::string(*param1); } 

Der beste Weg, um zu JS-Typen und C ++ – Typen zu konvertieren, ist die Verwendung von v8-juice , die Typ-Casting-Methoden bietet. Speziell verwende ich v8-convert , was ein Spin-Off von v8-Saft ist, der nur die Konvertierungsmethoden beinhaltet.

Die Konvertierung von args [0] in std :: list ist eine Zeile:

 std::list values = cvv8::CastFromJS >(args[0]); 

Wenn Sie NaN ( native Abstraktionen für Knoten ) verwenden, versuchen Sie diesen Code:

 std::string myString(*NanAsciiString(args[0]));