在 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());
以下代码片段是在将节点从 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());