从v8 :: Arguments转换为C++类型

mel*_*oon 31 c++ v8 node.js

我正在玩用C++创建Node.js模块,但我对v8 :: Arguments类感到困惑.假设我有一个用于发送电子邮件的Javascript类,它有一个带有此签名的方法:

Mailer::sendEmail(Array recipients, String sender, String message);
Run Code Online (Sandbox Code Playgroud)

这会被称为:

mailer.sendEmail(["joe@gmail.com", "sally@gmail.com"], "fred@gmail.com", "Hi there");
Run Code Online (Sandbox Code Playgroud)

现在在C++的土地上,我有一个带有这个签名的类函数:

SendEmail(const v8::Arguments& args)
Run Code Online (Sandbox Code Playgroud)

这是在Javascript土地上支持我的Mailer :: sendEmail方法.SendEmail函数将创建我的Emailer类的新实例,该实例本身具有带此签名的类函数:

send(std::list<std::string> recipients, std::string from, std::string message)
Run Code Online (Sandbox Code Playgroud)

这就是我迷失的地方.我不知道如何从args中获取值,并将它们转换为常规C++类型,因此我可以将值传递给send函数.据我了解,传递给Mailer :: sendEmail的3个值将在args [0],args [1]args [2]中提供.我甚至知道我可以做一些类型检查一样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());
}
Run Code Online (Sandbox Code Playgroud)

Rya*_*yan 50

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

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);    

}
Run Code Online (Sandbox Code Playgroud)

  • 虽然不是attactive我很确定你可以将上面的内容折叠成:`std :: string param1(*v8 :: String :: Utf8Value(args [0] - > ToString()));` (3认同)

mel*_*oon 6

我可以找到转换为JS类型和C++类型的最佳方法是使用v8-juice,它提供了类型转换方法.具体来说,我正在使用v8-convert,它是v8-juice的衍生产品,仅包含转换方法.

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

std::list<std::string> values = cvv8::CastFromJS<std::list<std::string> >(args[0]);
Run Code Online (Sandbox Code Playgroud)

  • 关于V8 Juice的警告:https://code.google.com/p/v8-juice/ ACHTUNG ACHTUNG ACHTUNG:截至2013年8月19日,该项目因为核心v8在此期间发生的不兼容变化而被放弃2013年上半年.V8 API正在以与每个v8使用不兼容的方式进行大幅改变.... (5认同)

Seg*_*ult 6

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

std::string myString(*NanAsciiString(args[0])); 
Run Code Online (Sandbox Code Playgroud)

  • `NanAsciiString`已被删除.请改用"Nan :: Utf8String".例如,`std :: string arg0 =*Nan :: Utf8String(info [0]);` (2认同)