Node.js 的本机 c++ 扩展:"cloning"构造函数中的本地<值>

native c++ extension for Node.js : "cloning" a Local< Value > in the constructor

本文关键字:gt lt cloning 本机 js c++ 扩展 Node 构造函数      更新时间:2023-10-16

我已经阅读了教程"编写Node.js原生扩展":https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions

代码运行正常(https://github.com/pquerna/node-extension-examples/blob/master/helloworld/helloworld.cc)

现在我想修改:

class HelloWorld: ObjectWrap
{
private:
  int m_count;
public:
(...)
 HelloWorld() :
    m_count(0)
  {
  }
(...)
 static Handle<Value> Hello(const Arguments& args)
  {
    HandleScope scope;
    HelloWorld* hw = ObjectWrap::Unwrap<HelloWorld>(args.This());
    hw->m_count++;
    Local<String> result = String::New("Hello World");
    return scope.Close(result);
  }
(...)
}

变成这样(在构造函数中复制一个参数,然后在'Hello()'中返回):

class HelloWorld: ObjectWrap
{
private:
  Local< Value > myval;/* <===================== */
public:
(...)
 HelloWorld(const Local< Value >& v) :
   myval(v) /* <===================== */
  {
  }
(...)
 static Handle<Value> Hello(const Arguments& args)
  {
    HandleScope scope;
    HelloWorld* hw = ObjectWrap::Unwrap<HelloWorld>(args.This());
    return scope.Close(hw->myval);/* <===================== */
  }
(...)
}

我的代码似乎不工作,hello()似乎返回一个整数

var h=require("helloworld");
var H=new h.HelloWorld("test");
console.log(H.hello());

在构造函数中复制myval并在函数'Hello()'中返回myval的正确方法是什么?我应该在析构函数中管理一些东西吗?

谢谢。皮埃尔

'Local'变量将被自动清除,所以你不能像那样保存它们的副本。你需要使用'Persistent'句柄。

class HelloWorld: ObjectWrap
{
private:
  Persistent< Value > myval;
public:
(...)
  HelloWorld(const Local< Value >& v) : 
    myval(Persistent< Value >::New(v)) {
  }
(...)
 static Handle<Value> Hello(const Arguments& args)
  {
    HandleScope scope;
    HelloWorld* hw = ObjectWrap::Unwrap<HelloWorld>(args.This());
    return scope.Close(hw->myval);
  }
(...)
}