从 v8 引擎调用函数抛出错误

Calling function from v8 engine throws error

我正在制作一个应用程序,需要我在某些 Javascript 代码中调用一个函数。问题是,尽管查找了很多次,我仍然得到同样的错误。

No matching function for call to 'v8::Object::Get(v8::Local<v8::Context>&, v8::MaybeLocal<v8::String>)'

我已经查看了几个不同的帖子甚至文档,但我什至无法 运行 使用该功能。

Isolate::CreateParams create_params;
        create_params.array_buffer_allocator = ArrayBuffer::Allocator::NewDefaultAllocator();
        Isolate* isolate = Isolate::New(create_params);
        {
            Isolate::Scope isolate_scope(isolate);
            HandleScope handle_scope(isolate);

            Local<Context> context = Context::New(isolate);
            Context::Scope context_scope(context);
            std::string fileContent = f.getContents("./src/solutions/6t10.js");;

            Local<String> source = String::NewFromUtf8(isolate, cv.stringToChar(fileContent), NewStringType::kNormal).ToLocalChecked();

            Local<Script> script = Script::Compile(context, source).ToLocalChecked();
            MaybeLocal<Value> result = script->Run(context).ToLocalChecked();

            Handle<Object> global = context->Global();
            MaybeLocal<String> strValue = String::NewFromUtf8(isolate, cv.stringToChar("prob"+std::to_string(pi)));
            Local<Value> value = global->Get(context, strValue);
            Handle<Function> func = Handle<Function>::Cast(value);
            Handle<Value> args[1] = { global->Get(context, String::NewFromUtf8(isolate, ca)) };
            MaybeLocal<Value> js_result = func->Call(context, global, 1, args);

            v8::String::Utf8Value answer(isolate, js_result.ToLocalChecked());
            answers+=*answer;

        }
        isolate->Dispose();
        delete create_params.array_buffer_allocator;

如果你找不到问题我就问这个,我怎样才能把一个LocalString转成LocalValue?谢谢:)

(这里是 V8 开发者。)@pm100 的评论是正确的:LocalMaybeLocal 不可互换,需要前者的功能不能处理后者。

名称的“可能”部分表示由于可能发生的某些错误(通常是异常),该值可能不存在。所需的显式转换可帮助 确保您不会忘记对此进行检查。 (很多年前,V8 的 API 没有这种区别,它是嵌入代码中无穷无尽的错误来源。)

how can I turn a Local to Local?

我猜你的意思是“我怎样才能把 MaybeLocal 变成 Local?”。

针对不同的场景有两种选择,您的代码已经包含其中一种的示例:
MaybeLocal::ToLocalChecked() 检查值是否存在,如果不存在则使进程崩溃,否则 returns Local。毫不奇怪,当您可以保证没有异常发生时,这是合适的,例如用于字符串分配。
MaybeLocal::ToLocal(Local* ...) 适用于您不能 保证值存在(即没有发生异常)并且您 的情况想要崩溃的过程。它检查一个值是否存在,如果不存在,returns false(这样你就可以优雅地处理这种情况),否则填充 out-parameter 中的 Local(和 returns true)。这通常用于从 JavaScript 返回的任何值。作为代码中的一个具体示例:如果 func->Call 抛出异常,js_result.ToLocalChecked() 将使进程崩溃。