节点 12 (v8) - 将不推荐使用的代码转换为 "maybe" 版本
Node 12 (v8) - converting deprecated code to the "maybe" version
我决定将 Node 更新到 12.11。因此,我在使用的某些节点模块中遇到 gyp 编译错误。我对 C++ 有一些经验,但我从未使用过 v8。我已经设法修复了大多数与以前弃用和现在删除的功能相关的错误,但有一种问题我无法解决:
v8::Local<v8::Object> obj = size->ToObject();
if(obj->Has(columns))
w->ws_col = obj->Get(columns)->Uint32Value();
if(obj->Has(rows))
w->ws_row = obj->Get(rows)->Uint32Value();
ToObject()
已被删除,所以我想出了这个:
v8::Local<v8::Object> obj = Nan::To<v8::Object>(size).ToLocalChecked();
问题是没有 v8::Object::Has(v8::Local<v8::String>&)
方法。如何使 Has
调用与新版本兼容?
旧 ToObject()
的非弃用替代品是 MaybeLocal<Object> v8::Value::ToObject(Local<Context> context)
;使用 Nan
当然是可能的,但不是必需的。请注意,如果抛出异常并且没有结果值,.ToLocalChecked
将触发崩溃,这可能会发生,例如如果您在 null
或 undefined
上调用此函数。结果类型 MaybeLocal
旨在表明嵌入程序代码需要对此进行检查,并酌情处理异常。
类似地,Has()
的非弃用版本是两个采用上下文参数的版本:Maybe<bool> v8::Object::Has(Local<Context> context, Local<Value> key)
和 Maybe<bool> v8::Object::Has(Local<Context> context, uint32_t index)
。如果抛出异常,Maybe<bool>
他们 return 什么都不是 (.IsNothing() == true
),否则结果是 bool
。
我决定将 Node 更新到 12.11。因此,我在使用的某些节点模块中遇到 gyp 编译错误。我对 C++ 有一些经验,但我从未使用过 v8。我已经设法修复了大多数与以前弃用和现在删除的功能相关的错误,但有一种问题我无法解决:
v8::Local<v8::Object> obj = size->ToObject();
if(obj->Has(columns))
w->ws_col = obj->Get(columns)->Uint32Value();
if(obj->Has(rows))
w->ws_row = obj->Get(rows)->Uint32Value();
ToObject()
已被删除,所以我想出了这个:
v8::Local<v8::Object> obj = Nan::To<v8::Object>(size).ToLocalChecked();
问题是没有 v8::Object::Has(v8::Local<v8::String>&)
方法。如何使 Has
调用与新版本兼容?
旧 ToObject()
的非弃用替代品是 MaybeLocal<Object> v8::Value::ToObject(Local<Context> context)
;使用 Nan
当然是可能的,但不是必需的。请注意,如果抛出异常并且没有结果值,.ToLocalChecked
将触发崩溃,这可能会发生,例如如果您在 null
或 undefined
上调用此函数。结果类型 MaybeLocal
旨在表明嵌入程序代码需要对此进行检查,并酌情处理异常。
类似地,Has()
的非弃用版本是两个采用上下文参数的版本:Maybe<bool> v8::Object::Has(Local<Context> context, Local<Value> key)
和 Maybe<bool> v8::Object::Has(Local<Context> context, uint32_t index)
。如果抛出异常,Maybe<bool>
他们 return 什么都不是 (.IsNothing() == true
),否则结果是 bool
。