从 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++ 类型 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur

随机推荐

  • 火狐浏览器不删除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