关于node.js:从v8 :: Arguments转换为C ++类型

Converting from v8::Arguments to C++ Types

我正在玩用C++创建多个模块,但我在V8:参数类上被难住了。假设我有一个用于发送电子邮件的javascript类,它有一个带有此签名的方法:

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

这就叫做:

1
mailer.sendEmail(["[email protected]","[email protected]"],"[email protected]","Hi there");

现在在C++领域中,我有一个带有这个签名的类函数:

1
SendEmail(const v8::Arguments& args)

这是在javascriptLand中支持我的mailer::sendmail方法。sendemail函数将创建我的emailer类的一个新实例,它本身有一个带有此签名的类函数:

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

这就是我迷路的地方。我不知道如何从ARG中获取值,并将它们转换成规则的C++类型,这样我就可以将这些值传递给我的发送函数。据我所知,传递给mailer::sendmail的3个值在args[0]、args[1]和args[2]中可用。我甚至理解我可以做一些类型检查,比如if (!args[0]->IsArray()),但实际上我不知道如何将args(0)转换为std::list

编辑:我发现了一种黑客的方法,但我仍然认为V8有一些内置的方法来以更干净的方式处理这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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());
}


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

1
2
3
4
5
6
7
8
9
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);    

}


如果您使用的是NAN(节点的本机抽象),请尝试以下代码:

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


我能找到的转换JS类型和C++类型的最好方法是使用V8Cube,它提供类型转换方法。具体来说,我使用的是V8 Convert,它是V8 Juice的衍生产品,只包括转换方法。

将ARGs(0)转换为STD::列表是一行:

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