/ / pas de fonction correspondante pour l'appel à Persistent <Function> :: New (Isolate * &, Local <Function> &) - c ++, node.js

pas de fonction correspondante pour l'appel à Persistent <Function> :: New (Isolate * &, Local <Function> &) - c ++, node.js

J'ai rencontré cette erreur lors de l'écriture d'un addon nodejs c / c ++, cela s'est produit lorsque j'ai essayé de stocker un rappel asynchrone dans Persistent.

Mais j'ai trouvé la déclaration dans v8.h: V8_INLINE Persistent (Isolate * isolate, Local <S> that). Semble rien n'est faux avec l'appel.

Joindre mon code. Merci d'avance! Cela m'a dérouté jours.

struct reqData
{
int result;
int a;
int b;
char name[128];
Persistent<Function> callback;
};

static Handle<Value> test(const FunctionCallbackInfo<Value>& args)
{
Isolate *isolate = Isolate::GetCurrent();
HandleScope scope(isolate);
if ( args.Length() < 3 || !args[0]->IsNumber() || !args[1]->IsNumber() )
{
return (*isolate).ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Bad argument")));
}

ssize_t int1 ( args[0]->Int32Value() );
ssize_t int2 ( args[1]->Int32Value() );
char nameBuffer[128] = {0};
args[2]->ToString()->WriteOneByte(nameBuffer);

if ( args[3]->IsFunction() )
{
Local<Function> callback = Local<Function>::Cast(args[3]);

reqData* request = new reqData;
request->callback = Persistent<Function>::New(isolate,callback);



request->a = int1;
request->b = int2;
strcpy(request->name, nameBuffer);

uv_work_t* req = new uv_work_t();
req->data = request;

uv_queue_work(uv_default_loop(), req, workerFunc, afterWorkFunc);
}
else
{
return (*isolate).ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Callback missing")));
}

return Undefined(isolate);
}

extern "C"
{
// equal to js
//
// exports.test = function Test(){};
//
static void init(Local<Object> exports)
{
//target->Set(String::NewSymbol("asyncAddon"), FunctionTemplate::New(test)->GetFunction());
NODE_SET_METHOD(exports, "asyncAddon", test);
}
}

NODE_MODULE(asyncAddon, init)

Réponses:

0 pour la réponse № 1

La question immédiate est que vous ne faites pas Persistent<..>::New(), vous venez .Reset() avec la valeur que vous souhaitez stocker dans le Persistent. Par exemple:

request->callback.Reset(isolate, callback);

Autres choses à noter:

  • Vous n'avez pas besoin HandleScope dans test() parce que la fonction est déjà appelée directement à partir de JavaScript, il y a donc déjà une étendue active. Vous avez seulement besoin d'un HandleScope lorsque vous utilisez l'API V8 sur le thread principal, que vous veniez du pool de threads libuv ou d'un autre endroit qui ne provient pas directement de JS Land.

  • Vous devriez vraiment envisager d'utiliser nan. Cela aide à atténuer les différences entre les versions V8 et vous évite de vous soucier de détails tels que les isolats et autres.

  • Si vous ne les connaissez pas déjà, des documents en ligne sur les API V8 sont en ligne. ici.