Node.js Дополнения к C : как создать объект JS Date с помощью N-API и версии 8 в Node.js 10

#node.js #node.js-addon

#node.js #node.js-дополнение

Вопрос:

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?

Или, может быть, я могу получить изоляцию версии 8 из N-API?

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

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

Ответ №1:

На данный момент я написал такой обходной путь. Правильнее использовать 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;
}