Как мне обновить собственный аддон Node.js, чтобы использовать новый API?

Мне нужен старый собственный аддон Node.js, который мне нужен для работы, но он больше не работает для Node.js 12 и выше из-за устаревания многих нативных API. Из десятков ошибок я исправил все, кроме одной, которая связана с инициализацией и вызовом функции обратного вызова. Для нового API требуется 4 аргумента, а для старого - 3. Это неработающий код:

void node_mpg123_feed_after (uv_work_t *req) {
  Nan::HandleScope scope;
  feed_req *r = (feed_req *)req->data;

  Local<Value> argv[1];
  argv[0] = Nan::New<Integer>(r->rtn);

  Nan::TryCatch try_catch;

  Nan::New(r->callback)->Call(Nan::GetCurrentContext()->Global(), 1, argv); //Compilation error in this line

  // cleanup
  r->callback.Reset();
  delete r;

  if (try_catch.HasCaught()) {
    FatalException(try_catch);
  }
}

В частности, обратите внимание на новый API, который использует 4 аргумента, и сравните его со старым, которому требуется только три. Я не могу понять, какие параметры вводить, поскольку в Интернете практически нет руководств по новому API, а в Интернете полно примеров старого сломанного.

Может кто-то указать мне верное направление? Я получаю точное сообщение об ошибкеerror C2660: 'v8::Function::Call': function does not take 3 arguments в строке, которую я пометил комментарием выше.

1 ответ

Решение

Пройдя через журнал изменений nan, прочитав источники nan, я нашел новый способ вызова обратных вызовов. В частности, строка:

Nan::New(r->callback)->Call(Nan::GetCurrentContext()->Global(), 1, argv);

становится

Nan::Call(Nan::New(r->callback), Nan::GetCurrentContext()->Global(), 1, argv);
Другие вопросы по тегам