从v8 :: Arguments转换为C ++types

我正在用C ++创buildNode.js模块,但我难住了v8 :: Arguments类。 比方说,我有一个JavaScript类发送电子邮件,它有一个这样的签名方法:

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

这将被称为是这样的:

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

现在在C ++的土地,我有一个类签名function:

 SendEmail(const v8::Arguments& args) 

这是支持我的梅勒:: sendEmail方法在Javascript土地。 SendEmail函数将创build我的Emailer类的新实例,它本身具有带有此签名的类函数:

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

而这就是我迷失的地方。 我不知道如何从args中取值,并将它们转换成常规的C ++types,所以我可以将值传递给我的发送函数。 据我所知,传递给Mailer :: sendEmail的3个值将在args [0]args [1]args [2]中可用。 我甚至明白,我可以做一些types检查, if (!args[0]->IsArray()) ,但实际上转换args [0]std::list<std::string>是我不知道如何去做。

编辑:我发现这样做的一个hackish的方式,但我仍然认为V8有一些内置的方法来处理这个更清洁的方式。

 static Handle<Value> SendEmail(const Arguments& args) { HandleScope scope; list<string> values; Local<Object> obj = args[0]->ToObject(); Local<Array> props = obj->GetPropertyNames(); // Iterate through args[0], adding each element to our list for(unsigned int i = 0; i < props->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<string>::iterator it = values.begin(); it != values.end(); it++) { cout << *it << endl; } return scope.Close(args.This()); } 

我知道这是一个较老的话题,但我倾向于这样做的方式如下:

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

我可以find转换为JStypes和C ++types的最佳方法是使用v8-juice ,它提供了types转换方法。 具体来说,我使用v8转换 ,这是一个分离的v8果汁,只包括转换方法。

将args [0]转换为std :: list是一行:

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

如果你正在使用NaN( 本地抽象节点 ),那么试试这个代码:

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