Node.js C ++ addons: как создать объект JS Date с помощью N-API и V8 в Node.js 10 - PullRequest
2 голосов
/ 22 марта 2019

Функция napi_create_date появилась в Node.js, начиная с версии 11.11.0. https://nodejs.org/api/n-api.html#n_api_napi_create_date

Какие есть обходные пути для создания JS Date (из C ++ double) на Node.js 10.15.3 с использованием только N-API и V8 API?

Или, может быть, я могу получить V8 Isolate от N-API?

Или как мне объединить N-API и NAN для создания Date и использовать его в napi_call_function?

Мне нужен какой-то способ создания значения Date (из C ++ double) для вызова napi_call_function.

1 Ответ

1 голос
/ 24 марта 2019

Пока я написал такой обходной путь. Более правильно использовать env->context() вместо v8::Isolate::GetCurrent(), но napi_env определено в src/js_native_api_v8.h, которого нет в ~/.node-gyp/10.15.3/include/node, поэтому я не нашел быстрого способа использования env->context().

#include <v8.h>

// This asserts v8::Local<> will always be implemented with a single
// pointer field so that we can pass it around as a void*.
static_assert(sizeof(v8::Local<v8::Value>) == sizeof(napi_value),
  "Cannot convert between v8::Local<v8::Value> and napi_value");

napi_status napi_create_date_by_v8(
    double time,
    napi_value* result
) {
  v8::Isolate* isolate = v8::Isolate::GetCurrent();

  v8::MaybeLocal<v8::Value> maybe_date = v8::Date::New(isolate, time);
  v8::Local<v8::Value> local = maybe_date.ToLocalChecked();
  *result = reinterpret_cast<napi_value>(*local);
  return napi_ok;
}
...