v8不再支持v8 :: Value :: ToNumber吗?
我目前正在使用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::ToNumber
中缺少对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();
}
...
我试图阅读nodejs文档,但是似乎没有证据表明要删除ToNumber
。还寻找相关问题,但没有匹配我的:(
也许与我的节点版本有关,但是在测试节点版本之前,我需要针对我的问题的一些答案。
我正在使用节点:10.16.3
npm:6.9.0
node-gyp:5.0.3
谢谢您的阅读。任何帮助表示赞赏!
回答如下:V8开发人员在这里。您找不到删除ToNumber
的证据,因为它尚未被删除;-)
只是已经弃用了一段时间的该函数的无参数版本终于被删除了。替换版本是将Local<Context>
作为参数的版本,请参见此处:https://github/nodejs/node/blob/v10.16.3/deps/v8/include/v8.h#L2425
[技术背景是ToNumber
可以最终执行JavaScript(例如,如果使用valueOf
方法在对象上调用它),并且执行JavaScript是特定于上下文的。 ToNumber
所使用的上下文过去是隐式的,这很难推理,有时会导致嵌入器方面的细微错误。因此,V8的“新”(过去几年)API理念是使上下文参数明确。嵌入应用程序越复杂,您(希望)会越欣赏代码的结构越明显。
ToString
在同一条船上,顺便说一句。在这种情况下,无参数版本仍然存在,但已弃用;替换为ToString(Local<Context> context)
。
v8不再支持v8 :: Value :: ToNumber吗?
我目前正在使用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::ToNumber
中缺少对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();
}
...
我试图阅读nodejs文档,但是似乎没有证据表明要删除ToNumber
。还寻找相关问题,但没有匹配我的:(
也许与我的节点版本有关,但是在测试节点版本之前,我需要针对我的问题的一些答案。
我正在使用节点:10.16.3
npm:6.9.0
node-gyp:5.0.3
谢谢您的阅读。任何帮助表示赞赏!
回答如下:V8开发人员在这里。您找不到删除ToNumber
的证据,因为它尚未被删除;-)
只是已经弃用了一段时间的该函数的无参数版本终于被删除了。替换版本是将Local<Context>
作为参数的版本,请参见此处:https://github/nodejs/node/blob/v10.16.3/deps/v8/include/v8.h#L2425
[技术背景是ToNumber
可以最终执行JavaScript(例如,如果使用valueOf
方法在对象上调用它),并且执行JavaScript是特定于上下文的。 ToNumber
所使用的上下文过去是隐式的,这很难推理,有时会导致嵌入器方面的细微错误。因此,V8的“新”(过去几年)API理念是使上下文参数明确。嵌入应用程序越复杂,您(希望)会越欣赏代码的结构越明显。
ToString
在同一条船上,顺便说一句。在这种情况下,无参数版本仍然存在,但已弃用;替换为ToString(Local<Context> context)
。