Обработка объектов JavaScript в узле C++ Nan Addon
Мой код передает объект JavaScript в функцию, реализованную в C++. Код C++ должен проверять тип каждого свойства и предоставлять значение по умолчанию, если либо свойство отсутствует, либо тип неправильный.
Следующий код, кажется, работает (только показывает регистр целых чисел), но мне интересно, есть ли более простой способ справиться с этим. Я ни в коем случае не эксперт в этой области, поэтому все предложения по улучшению приветствуются.
int get_integer(
v8::Local<v8::Object> obj,
v8::Local<v8::String> prop,
int default_value = 0) {
if (Nan::Has(obj, prop).FromMaybe(false)) {
Nan::MaybeLocal<v8::Value> v = Nan::Get(obj, prop);
if (!v.IsEmpty()) {
v8::Local<v8::Value> val = v.ToLocalChecked();
if (val->IsInt32() || val->IsNumber()) {
return val->IntegerValue();
}
}
}
return default_value;
}
Он вызывается кодом, подобным следующему:
v8::Local<v8::Object> obj = info[0]->ToObject();
v8::Local<v8::String> prop = Nan::New<v8::String>("prop").ToLocalChecked();
int x = get_integer(obj, prop);
1 ответ
Если то, что вы ищете, является упрощением, вам следует взглянуть на новый API под названием N-API, поддерживаемый NodeJs.
Код становится легче, так как вам никогда не придется касаться какого-либо объекта v8 напрямую. Официальная документация в основном для C, но я рекомендую вам взглянуть на оболочку C++. Документация не полная, но так как вы уже использовали NaN, она очень похожа, и вы можете найти некоторые статьи по ней, а также примеры, в папках "node-addon-api" для версий C++.
Существует инструмент преобразования для преобразования кода на основе NaN в код N-API, но, поскольку вы интенсивно используете конструкции v8, я рекомендую переделывать эти части, используя только API-интерфейсы.