在 c++ 和 nodejs 之间传递数据

passing data between c++ and nodejs

以下代码片段是在将节点从 v0.12 升级到 v6.11 后引起的

vector<char> buf;
// code that populates the vector

Local<Object> nbuf = Buffer::New(args.GetIsolate(), &buf[0], buf.size());

//return buffer to node    
args.GetReturnValue().Set(scope.Escape(nbuf));

节点升级意味着必须改变:

Local<Object> nbuf = Buffer::New(args.GetIsolate(), &buf[0], buf.size());

至:

Local<Object> nbuf = Buffer::New(args.GetIsolate(), &buf[0], buf.size()).ToLocalChecked());

问题是当打印出节点缓冲区的内容时,内容不一样。 所以问题是:如何在使用节点 v6.11 时获得与节点 v0.12 相同的行为?

更新:经过一些研究,我发现了潜在的问题——Buffer:New 调用 ArrayBuffer::New,它在现有的内存缓冲区之上构建了一个 arrayBuffer,所以当它超出范围时,缓冲区只包含堆栈上的任何内容。在 node-v0.12 Buffer:New 中,正在创建它拥有的数据的副本。 问题是我仍然不知道如何使用 node-v6

获得相同的行为

您的 ToLocalChecked() 放错对象了。正确的是:

Local<Object> nbuf = Buffer::New(args.GetIsolate(), &buf[0], buf.size()).ToLocalChecked();

张贴这个以防万一有人遇到同样的问题:

问题是在节点 0.12 和节点 v6 之间执行 Buffer::New(...)

MaybeLocal<Object> New(Isolate* isolate, const char* data, size_t length)

已更改:在节点 0.12 中它用于调用 memcpy,而对于节点 v6 仅调用 ArrayBuffer::New(env->isolate(), data, length) 并且这不会复制数据。根据文档:

static Local v8::ArrayBuffer::New ( Isolate * isolate, void * data, size_t byte_length )

Create a new ArrayBuffer over an existing memory block. The created array buffer is immediately in externalized state. The memory block will not be reclaimed when a created ArrayBuffer is garbage- collected.

因此,ArrayBuffer 构建于其上的本地创建的向量超出了范围,您将剩下堆栈中的任何内容...这与我所看到的差不多。

解决方法:调用Buffer::Copy(args.GetIsolate(), &buf[0], buf.size());