v8 不再支持 v8::Value::ToNumber 了吗?

lee*_*lee 5 c++ v8 node.js node.js-addon

我目前正在寻找带有 node-gyp 的 C++ 附加组件。

node-gyp configure工作正常,但node-gyp build给出了一个错误 error C2661: 'v8::Value::ToNumber': no overloaded function take 0 parameter

有一些关于已弃用的警告,它们提供了一个链接到 v8.h 文件(在 node-gyp 中)的声明。但是,关于ToNumber 的只有V8_DEPRECATED 和V8_WARN_UNUSED_RESULT。因此,似乎由于缺少关于v8::Value::ToNumberin的定义而导致错误v8.h

错误发生在下面的最后一行代码:

void someFunction(const FunctionCallbackInfo<Value>& args) {
    Isolate *iso = args.GetIsolate();
    if (args.Length() < 1) {
        iso->ThrowException(Exception::TypeError(String::NewFromUtf8(iso, "Must provide Input")));
    }

    Local<Object> coords = args[0]->ToObject()->Clone();  // note that the keys are available with coords->GetOwnPropertyNames();
    Local<Array> keys = coords->GetOwnPropertyNames();

    if (keys->Length() != 2) {
        iso->ThrowException(Exception::TypeError(String::NewFromUtf8(iso, "Need exactly 2 values")));
    }

    char props[2];
    double values[2];

    for (int i=0; i < 2; i++) {
        String::Utf8Value key(keys->Get(i)->ToString());
        props[i] = (*key)[0];
        values[i] = coords->Get(keys->Get(i))->ToNumber()->Value();
    }
    ...
Run Code Online (Sandbox Code Playgroud)

我试图阅读 nodejs 文档,但似乎没有关于删除ToNumber. 还寻找了相关的问题,但没有与我的匹配:(

也许它与我的节点版本有关,但是在使用节点版本进行测试之前,我需要一些问题的答案..

我正在使用节点:10.16.3npm: 6.9.0node-gyp:5.0.3

感谢您的阅读。任何帮助表示赞赏!

jmr*_*mrk 8

V8 开发人员在这里。你找不到删除的证据,ToNumber因为它没有被删除;-)

只是之前已经弃用了一段时间的函数的无参数版本终于被舍弃了。替换是将 aLocal<Context>作为参数的版本,请参见此处:https : //github.com/nodejs/node/blob/v10.16.3/deps/v8/include/v8.h#L2425

技术背景是ToNumber最终可以执行 JavaScript(例如,如果它是通过valueOf方法在对象上调用的),并且执行 JavaScript 是特定于上下文的。使用的上下文ToNumber曾经是隐式的,这很难推理,有时会导致嵌入器方面的细微错误;所以 V8 的“新”(过去几年)API 理念是明确上下文参数。您的嵌入应用程序越复杂,您(希望)就越会欣赏代码的更明显结构。

ToString是在同一条船上,顺便说一句。在这种情况下,无参数版本仍然存在,但已弃用;替代品是ToString(Local<Context> context).