节点 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 将触发崩溃,这可能会发生,例如如果您在 nullundefined 上调用此函数。结果类型 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