问题标签 [node.js-nan]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
469 浏览

node.js - 节点 NAN:在 AsyncWorker 的 Execute 方法中调用 GetFromPersistent 设置错误

我正在为节点构建一个本机扩展,其中包括一个长时间运行的操作,并在完成时进行回调。

我将节点缓冲区传递给调用。它包含扩展要处理的内容的有效负载。

我应该能够将我的缓冲区存储在我的 AsyncWorker 的构造函数中的持久存储中,并在以后需要时检索它。

这个例子(来自 nan 测试套件)是我通常基于我的代码的: https ://github.com/nodejs/nan/blob/master/test/cpp/bufferworkerpersistent.cpp

该测试有效,但在使用 HandleOKCallback 方法之前它不会对缓冲区做任何事情,这对我来说不是很有趣。我需要在 Execute 方法期间访问缓冲区。

如果我只是在测试的 Execute() 方法中添加一行来尝试访问缓冲区,如下所示:

GetFromPersistent 调用出现段错误。

我的问题是:我错过了什么?我是否应该无法将持久对象拉入 Execute 方法?如果是这样,为什么不呢?

0 投票
1 回答
574 浏览

c++ - 这与 ObjectWrap::Unwrap 的持有人

该类v8::FunctionCallbackInfo区分ThisHolder。我知道thisJavaScript 中有什么,并假设它This反映了该设置。但是我对什么是什么只有一个模糊的概念Holder,而且对于何时应该使用Holder而不是This.

特别是,在编写基于 nan 的 node.js 扩展并解包ObjectWrap时,我应该通过哪些?

当前node::ObjectWrap文档有示例 usingHolder当前Nan::ObjectWrap文档使用This,因此“仅按照文档中的示例”无助于回答这个问题。

0 投票
6 回答
34454 浏览

node.js - 错误:找不到模块“nan”

我正在开发本机 Node.js 插件并关注nan 文档

我将 nan 包含在 binding.gyp 中,例如: "include_dirs" : [ "<!(node -e \"require('nan')\")" ]

nan 也在 npm 依赖项中。

但是当我在另一个节点模块中安装包时 node-gyp 失败并出现错误

0 投票
1 回答
1956 浏览

c++ - 如何使用新版 Node Nan Persistent

使用以下等效代码的新版本Nan:以下代码适用于 0.12.*,但不适用于 4.3.0 及更高版本。

0 投票
1 回答
4468 浏览

c++ - NodeJS 插件从 NAN AsyncWorker::Execute 内部调用 Javascript 回调

我想从我的异步插件函数中调用 nodejs 回调。我已经看到了同步示例(此处),并且我正在使用一个出色的异步示例(此处)作为起始基础。

但是,当我尝试执行一个给 c++ AsyncWorker 子类的回调时,我得到一个分段错误。

这是我的代码:

我的问题:

  1. 我不应该使用 Nan 的 AsyncWorker 而是自己动手吗?
  2. 如何设置 Execute 函数以调用 Javascript?
0 投票
1 回答
686 浏览

javascript - v8::value 到日期之间的转换

我正在使用 nan 在 v8 上编写 C++ 插件。构造函数的参数之一是 Date 类型。IsDate 返回 true,但我不知道如何将其转换为 C++ Date 对象以获取年、月和日等。

感谢您的帮助!

0 投票
0 回答
190 浏览

c++ - 如何在本机节点模块的异步工作类中使用复杂的 v8 数据类型?

我尝试使我的节点模块方法异步。我创建了一个 AsyncWorker 类,但遇到了一些事情:/

我的 Nan::AsyncWorker 如下所示...

--

当我实现此方法时,调用崩溃而没有其他信息。进一步阅读指出访问 V8 或 V8 数据结构是不安全的。所以我认为这是因为同步方法有效的原因。

  1. 我需要将所有变量转换为Nan数据类型吗?如果是这样,什么是等价的Nan::v8::Local<v8::Array>以及v8::Handle<v8::Array>如何转换它们,反之亦然?
  2. C++代码执行失败时如何获取有用的异常信息?

完整的源代码可在此处获得:https ://github.com/sa/iso-8583/blob/30ac35796ba5014ad5668ac2919fddcb3b082580/functions.cc#L144 。只需克隆 reponpm installnpm test

也许有人喜欢创建一个 PR :),无论如何,我对任何帮助提示感到非常高兴!我只是希望使现有方法异步更简单^^

0 投票
1 回答
206 浏览

node.js - How to create namespace hierarchy in node.js addon?

I'm creating a node.js addon, which has bunch of classes. I want to organize them in a hierarchical namespace. If I were doing this in Javascript it would look like this

I'm using Nan to write my node.js binding. To achieve the above result I've written code as follows:

com.h

com.cpp

example.h

example.cpp

person.h

person.cpp

This code compiles and also successfully passes the tests when run. However I get a warning when the addon is loaded.

It prints a stack trace. The top of this trace is at the line marked XXXXXX.

If this is not the recommended way to define a FunctionTemplate as a member of another FunctionTemplate, then what's the right way to achieve it? Any ideas?

0 投票
2 回答
956 浏览

c++ - 如何将二进制数据从 C++ 传递到 Node.js

我在 C++ 变量缓冲区中有一个二进制数据,如下所示:

我想将此缓冲区传递给 Node.js 并写入文件。我使用下面的行将其转换为本地,然后包装为一个对象:

但是,在 node.js 中,当我检查接收数据的长度时,它只打印 9 并且值似乎已损坏。

此处 rahul2.jpg 已损坏,只有 9 个字节。我们如何从 node.js 代码中获取 rahul2.jpg 与 c++ 中的 rahul.jpg 相同?我们应该使用哪个 Nan::New() 来传递不受影响的二进制数据?请帮忙。谢谢。

0 投票
1 回答
689 浏览

node.js - 如何使用 nan 在 nodejs 中获取任意大小的缓冲区

我有一个 node js 应用程序,它使用sharp对大文件进行一些图像处理,然后使用 nan 与 node.js 交互。当我加载一个非常大的图像时,我从 nan 收到一个错误,上面写着

node: ../node_modules/nan/nan.h:679: Nan::MaybeLocal<v8::Object> Nan::NewBuffer(char*, size_t, node::Buffer::FreeCallback, void*): Assertion `length <= imp::kMaxLength && "too large buffer"' failed. Aborted (core dumped)

你可以在这里看到 nan.h 的第 679 行

但总而言之,它是这样说的:

// arbitrary buffer lengths requires // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION assert(length <= imp::kMaxLength && "too large buffer");

我有

$ node -v v4.4.6

您可以看到文件顶部的哪个版本应该是比 更高的版本IOJS_3_0_MODULE_VERSION,提供任意长度的缓冲区。但是,断言没有被 s 包围#ifdef。有谁知道在使用 nan 时如何使用任意长度的缓冲区?