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

2023-12-31

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

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

这将被称为这样:

mailer.sendEmail(["joe@gmail.com", "[email protected] /cdn-cgi/l/email-protection"], "[email protected] /cdn-cgi/l/email-protection", "Hi there");

现在在 C++ 领域,我有一个具有以下签名的类函数:

SendEmail(const v8::Arguments& args)

它支持我在 Javascript 领域的 Mailer::sendEmail 方法。 SendEmail 函数将创建我的 Emailer 类的一个新实例,该实例本身有一个具有以下签名的类函数:

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

这就是我迷失的地方。我不知道如何从中获取值args,并将它们转换为常规 C++ 类型,这样我就可以将值传递给我的send功能。据我了解,传递给 Mailer::sendEmail 的 3 个值将在args[0], args[1], and args[2]。我什至知道我可以做一些类型检查,比如if (!args[0]->IsArray()),但实际上转换args[0] to std::list<std::string>我不知道该怎么做。

Edit:我发现了一种 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);    

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 v8::Arguments 转换为 C++ 类型 的相关文章

  • 在 C++ 中,std::string::push_back() 的摊余复杂度是 O(1) 吗?

    我知道标准指定它适用于向量 但是字符串呢 是的 它是摊销常数时间 请参见第 716 页的表 101本文件的 http www open std org jtc1 sc22 wg21 docs papers 2012 n3485 pdf 表
  • 为什么不能使用initializer_list来初始化unique_ptr的向量? [复制]

    这个问题在这里已经有答案了 我想知道为什么initializer list 不能与unique ptr 一起使用 std vector
  • 不能使用函数名称距离

    以下代码可以正常编译 include
  • Visual Studio 2015 C# 找不到参考

    我在使用 Visual Studio 2015 和 C 时遇到了问题 在同一解决方案中添加对其他项目的引用时 Visual Studio 找不到所有类 例如 我创建了一个单元测试项目 我添加了对我创建的通信项目的引用 库中有 10 个类 但
  • 是否返回 std::move (x)?

    Are std vector
  • 我可以将特定警告视为错误吗?

    以下是我有时在学生代码中看到的模式的简化版本 bool foobar int a int b if a lt b return true 当然 真正的代码要复杂得多 Visual Studio 报告警告 C4715 并非所有控制路径都会返回
  • 为什么 .Net 框架指南建议您不要使用 ref/out 参数?

    显然 他们很 混乱 这是认真的原因吗 你还能想到其他的吗 你见过有多少开发人员并不真正理解 ref out 吗 我在真正需要的地方使用它们 但在其他地方则不然 它们通常仅在您想有效返回两个或多个值时才有用 在这种情况下它至少值得thinki
  • 如何停止 PythonShell

    如何终止 停止 Node js 中 PythonShell 执行的 Python 脚本的执行 我在交互模式下运行 输出通过 socket io 发送到给定的房间 如果没有更多的客户端连接到这个房间 我想停止 python 脚本的执行 这是我
  • 如何实现可变虚拟成员函数

    所以我有这个功能 virtual void CallRemoteFunction const char pServerGameObjectId const char pFunctionName OVariant arg1 OVariant
  • 二维数组的列求和

    我有一个IEnumerable
  • 使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理

    如何使用 C 和 NET Core 3 x 管理 AWS Cognito 用户池中的用户 在文档中找不到有关它的任何内容 Attilio Gelosa 的原创文章 我写这篇文章是希望对其他人有帮助 我必须阅读一页又一页的文档 并从 AWS
  • 如何在Phone类库项目中添加ResourceDictionary并访问它

    我正在开发一个项目 其中我有一个引用图书馆项目的子项目 在我的库项目 电话类库 中 如何创建 ResourceDictionary xaml 其中我需要添加一些样式并在 xaml 文件和 cs 文件中使用它 我需要访问 xaml 文件中的
  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域
  • 如何在 C 预处理器中可靠地检测 Mac OS X、iOS、Linux、Windows? [复制]

    这个问题在这里已经有答案了 如果有一些跨平台 C C 代码需要在 Mac OS X iOS Linux Windows 上编译 我如何在预处理器过程中可靠地检测到它们 大多数编译器都使用预定义的宏 您可以找到列表here http sour
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • 不兼容的指针到字符转换

    我正在编写一个程序 将卡片值写入 52 个点字符的多维数组中 该程序是一个测试数组 稍后我将其作为函数写入主程序中 在程序中 我通过以下方式初始化 for 循环计数0通过51 我用一个switch语句调制13将卡牌值分配给数组点 但是 我收
  • C++ 项目编译为静态库,编译为动态库失败(链接器错误)。为什么?

    我有一个 VS2008 本机 C 项目 我希望将其编译为 DLL 它仅引用一个外部库 log4cplus lib 并使用其功能 当然也使用 log4cplus 的 h 文件 当我尝试将我的项目编译为静态库时 它成功了 当我尝试作为 DLL
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • 如何正确地将十六进制转义添加到字符串文字中?

    当你有C语言的字符串时 你可以在里面直接添加十六进制代码 char str abcde a b c d e 0x00 char str2 abc x12 x34 a b c 0x12 0x34 0x00 这两个示例在内存中都有 6 个字节
  • 使texture2D在运行时/脚本Unity3D中可读[重复]

    这个问题在这里已经有答案了 我有一个插件 可以让我访问 Android 手机图库中的图片 这给了我一个Texture2D类型的纹理 然后我想使用 GetPixels 函数对其进行编辑 但默认情况下它未设置为可读 如何使纹理可读 以便我可以在

随机推荐

  • 火狐浏览器不删除cookies

    cookie 过期的时间 这是一个 Unix时间戳所以是在数量 自纪元以来的秒数 其他 换句话说 你很可能会设置这个 使用 time 函数加上 距离您需要的秒数 直到到期为止 或者您可以使用 mktime time 60 60 24 30
  • Flipboard 或 iBooks 风格的动画

    有没有类似 iBooks 或 Flipboard 等模拟翻页的示例 YES 前几天我在 github 上看到了这个 http github com brow leaves http github com brow leaves 类似 iBo
  • Laravel 服务容器和服务提供者

    需要通过示例了解Laravel服务容器和服务提供者 The 服务容器是我们应用程序的地方bindings被存储 和服务供应商是我们注册绑定的类服务容器 在 Laravel 的旧版本中 我们没有这些提供程序 开发人员总是询问在哪里放置绑定 答
  • 如何从 List 获取 IntStream?

    我可以想到两种方法 public static IntStream foo List
  • 新 Firebase 中的 Firebase AngularFire

    我有一个角度应用程序 它利用 angularFire 库 firebase文档中指出支持angularfirehttps firebase google com support guides firebase web update your
  • 在烧瓶中嵌入散景图和数据表

    我正在尝试使用 Bokeh 文档中提供的一些示例将散景图和散景数据表嵌入到烧瓶生成的网站 同一页面 中 两个组件都独立工作 我尝试通过 gridplot 将它们放在一起 但这似乎只适用于绘图 而数据表是一个 小部件 我可能缺少一些非常基本的
  • 在 Visual Studio Code 中进行格式化时,将 HTML 属性包裹在用户设置的新行上

    在我们的团队中 有些人使用 Webstorm 其他人使用 Visual Studio Code 当用户将属性放在新行上时 Webstorm 会垂直对齐属性 它将与行中的最后一个属性对齐 Visual Studio Code 有一个设置 您可
  • 动画内在内容大小的变化

    我有一个 UIView 子类 它绘制一个半径变化的圆 带有漂亮的弹性动画 视图决定了圆的大小 我希望这个 UIView 子类更改其帧大小以匹配对圆半径的动画更改 并且我希望这些更改能够修改连接到视图的任何 NSLayoutConstrain
  • .net micro (µ) 希腊字母大写问题

    我有以下代码 string firstMicro aa u00b5 bb string secondMicro aa u03bc bb Assert IsFalse firstMicro secondMicro string upperFi
  • 如何显示 PHP 错误?

    我已经检查了我的 PHP ini 文件 php ini and display errors已设置 并且错误报告也已设置E ALL 我已经重新启动了我的 Apache 网络服务器 我什至将这些行放在脚本的顶部 它甚至没有捕获简单的解析错误
  • 负载平衡 Web 服务器上的 Orchard CMS

    我正在考虑在负载平衡服务器上运行 Orchard CMS 两台带有硬件负载平衡器的 Web 服务器和一个 SAN 文件共享 我一直无法找到这方面的任何信息 我想知道是否会存在更新和缓存问题 如果缓存页面 更新是否会传播到其他服务器 我还想知
  • Android:如何以对话框或弹出窗口的形式显示 wifi(选择要连接的 SSID)?

    我开发了一个应用程序 想要将 wifi 网络显示为对话框 弹出窗口 我的代码是 startActivity new Intent WifiManager ACTION PICK WIFI NETWORK It just show wifi
  • Certbot - 找不到合适的 TLS CA 证书捆绑包 [Archlinux]

    我正在尝试通过 certbot 软件包版本 0 21 1 1 从 Let s Encrypt It 生成证书 但出现错误 我正在使用 webroot 模块 OSError Could not find a suitable TLS CA c
  • 基于Ajax响应的Reactjs动态页面中404如何处理?

    我有带有动态 ID 的反应组件
  • 芹菜:“明显偏离”

    我的分布式系统上的芹菜有很大的问题 我有几台不同本地化的机器 并且我的日志文件中有很多警告 例如 与 celery host 发生重大偏差 我能够设置日期以返回相同的值 即使机器位于不同的国家 地区 但 python print utcof
  • 我不想在生成记录时显示 mysql 中的某些表和某些列

    由于我已经让管理员动态创建表单 当他创建表单时 我所做的是动态创建表单的表 一切都工作正常 现在我想显示用于生成报告的表格和列 我不想表现出来 用户登录 地点 地点 用于生成报告的表格和三列 user id 用户常用号 年份 这三列对于我动
  • 你的清单中的 android:description 标签出现在哪里?

    android label 参数显示在主屏幕上的图标下方 但我看不到 android description 标签显示在手机上的位置 主屏幕 应用程序设置菜单 我在Android官方文档中没有找到答案 任何想法 虽然我在 Android 操
  • HTML 复选框表单和 HTTP URL

    所以 我有这个 HTML 表单
  • 变量名中的 Perl 变量替换

    usr bin perl my var a sub a a var a a print var sub a n sub b b var b b print var sub b n DATA b 为什么打印b 而不打印a 这对我来说似乎是非常
  • 从 v8::Arguments 转换为 C++ 类型

    我正在尝试用 C 创建 Node js 模块 但我对 v8 Arguments 类感到困惑 假设我有一个用于发送电子邮件的 Javascript 类 它有一个具有以下签名的方法 Mailer sendEmail Array recipien