NodeJS Nan C ++ ligar objecto aninhada para exemplo complemento

votos
3

Em um projeto C ++ NodeJS Atualmente estou trabalhando, eu quero ter um objeto que contém um objeto aninhado, como

console.log(object.myObject); // { [keys: string]: any }

Sem objetos ligação a propriedades meu addon está funcionando muito bem. Eu criar a instância com

auto ctor = Nan::New<v8::FunctionTemplate>(New);
auto ctorInst = ctor->InstanceTemplate();

E ligar o objeto para a instância de classe como

v8::Local<v8::Object> obj = Nan::New<v8::Object>();
ctorInst->Set(Nan::New(myObject).ToLocalChecked(), obj);

que imprime a seguinte durante a execução do código JS (criar uma instância do C ++ extensão).

# Erro fatal em, linha 0

# Verifique falhou: value_obj-> IsJSReceiver () || value_obj-> IsTemplateInfo ().

Nas primitivas de ligação outro lado (número, corda, etc.) funciona perfeitamente.

ctorInst->Set(Nan::New(myObject).ToLocalChecked(), Nan::New<v8::Number>(42));

Você tem alguma sugestão? Obrigado e aplausos!

Publicado 20/10/2018 em 13:56
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Todos os modelos (incluindo InstanceTemplate de) só pode ter outros modelos, ou primitivas, em si. Como você vê, IsTemplateInfoera falsa, quando deveria ter sido verdade. Uma pergunta semelhante foi feita e respondida aqui . Basta fazer uma ObjectTemplate e, em seguida, preenchê-lo como você estava fazendo com o FunctionTemplate.

Somente quando o modelo é instanciado (com GetFunction), você pode preenchê-lo com objetos reais.

Respondeu 23/10/2018 em 18:08
fonte usuário

votos
0

Além de resposta Nicholas' Eu gostaria de acrescentar o seguinte.

Instância

Basta substituir o v8::Objectcom v8::ObjectTemplate. Definir as propriedades para o modelo objecto e ligam-se o modelo para o exemplo complemento.

v8::Local<v8::ObjectTemplate> objTemplate = Nan::New<v8::ObjectTemplate>();
objTemplate->Set(Nan::New("prop").ToLocalChecked(), Nan::New<v8::Number>(42));
ctorInst->Set(Nan::New("myObject").ToLocalChecked(), objTemplate);

Agora você é capaz de usar

console.log(addonInstance.myObject); // { prop: 42 }

Protótipo

Se você deseja vincular funções ao objeto, criar um modelo de objeto como acima. Em seguida, crie um modelo de função de uma função CPP existente, e vinculá-lo a uma propriedade do objeto do modelo de objeto. Em seguida, criar um modelo no protótipo casos addon.

v8::Local<v8::ObjectTemplate> objTemplate = Nan::New<v8::ObjectTemplate>();
objTemplate->Set(Nan::New("prop").ToLocalChecked(), Nan::New<v8::Number>(42));

auto fn = Nan::New<v8::FunctionTemplate>(setup);
objTemplate->Set(Nan::New("setup").ToLocalChecked(), fn);
Nan::SetPrototypeTemplate(ctor, "myObj", objTemplate);

e a função de configuração é simplesmente

NAN_METHOD(YourClass::setup) {
  info.GetReturnValue().Set(Nan::New<v8::String>("Hello world").ToLocalChecked());
}

A saída do console seria

console.log(addonInstance.myObject) // { prop: 42, setup: [Function: setup] }
Respondeu 23/10/2018 em 20:28
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more