v8::HandleScope::CreateHandle() # 中的致命错误无法在没有 HandleScope 的情
Fatal error in v8::HandleScope::CreateHandle() # Cannot create a handle without a HandleScope
我正在编写一个 .cc 文件,以便我可以在.js文件中读取函数。
代码结构如下:
napi_value createResult(napi_env env, string resultType, int64_t handlevalue) {
napi_status status;
napi_value ObjectRef, returnObject, errorObject;
printf("INSIDE FUCNTION: PART1n");
// Creating NAPI Object's
status = napi_create_object(env, &ObjectRef);
std::cout<<"status="<<status<<std::endl;
assert(status == napi_ok);
printf("INSIDE FUCNTION: PART2n");
status = napi_create_object(env, &errorObject);
assert(status == napi_ok);
printf("INSIDE FUCNTION: PART3n");
status = napi_create_object(env, &returnObject);
assert(status == napi_ok);
printf("INSIDE FUCNTION: PART4n");
const char* resultTypeChar = resultType.c_str();
status = napi_set_named_property(env, returnObject, &resultTypeChar[0], ObjectRef);
assert(status == napi_ok);
printf("INSIDE FUCNTION: PART5n");
return returnObject;
}
void ABC(napi_env env, void* data){
// some code....
size_t handlevalue = access._handle;
obj->result = createResult(env,"access",handlevalue);
obj->async_action_status = 0;
}
}
napi_value f1(napi_env env,
napi_callback_info info) {
//
napi_value promise;
napi_status status;
// some code....
napi_value resource_name;
napi_create_string_utf8(env, "f1", NAPI_AUTO_LENGTH, &resource_name);
napi_create_async_work(env, NULL, resource_name, ABC, DEF, obj, &obj->work);
napi_queue_async_work(env, obj->work);
return promise;
}
在编译此文件然后运行.js文件时,将显示以下错误:
INSIDE FUCNTION: PART1
#
# Fatal error in v8::HandleScope::CreateHandle()
# Cannot create a handle without a HandleScope
#
Illegal instruction (core dumped)
我没有在我的代码中的任何任何地方使用任何v8
或HandleScope
或CreateHandle
函数。
由于我对所有这些promise
和async
的东西都是新手,所以我对如何解决这个问题一无所知。
请帮忙
根据我的学习,我创建并刚刚发布了 napi-threadsafe-deferred,您可以在那种情况下使用它。它基于 C++ 包装器节点插件 API,但如果您愿意,您可以将其移植到纯 NAPI。
它在主 js 线程上异步执行实际的承诺解析/拒绝,这是唯一允许从中调用它的线程。
你可以重写你的代码(省略噪音以专注于重要的东西(:
napi_value createResult(napi_env env, string resultType, int64_t handlevalue) {
// ...
return returnObject;
}
void ABC(napi_env env, void* data){
// ...
myDeferred.Reslove([&handlevalue]{
// this is executed on the correct thread!
// BEWARE, that references passed in might get
// invalid as this code is executed after the
// ABC has returned!
return createResult(env,"access",handlevalue);
});
// ...
}
}
napi_value f1(napi_env env,
napi_callback_info info) {
ThreadSafeDeferred myDeferred = new ThreadSafeDeferred(Env());
// pass myDeferred to your async task (calling ABC)
return ThreadSafeDeferred.Promise();
}
就我而言,问题是我们使用的是最后一个节点版本,而不是最后一个节点 LTS 版本。
因此,只需将节点版本回滚到最后一个节点 LTS 版本即可解决问题。
此外,请确保您使用的是该节点版本默认附带的 NPM 版本。
几个有趣的观点:
-
我们是 usign NextJS(构建失败,出现"v8::HandleScope::CreateHandle(("错误(
-
在本地一切正常,问题仅在生产中出现(使用 docker 部署(
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- Mongodb c++驱动程序:如何查询元素的数组
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 具有瞬态资源的RAII类
- .cpp和.h文件中的模板专用化声明
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 反向给定链表中的K节点
- 将数组的地址分配给变量并删除
- 正在查找文档以获得PS4平台的C++中的设备信息
- C++为构建时间获取QDateTime的可靠方法
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 我的神经网络不起作用 [XOR 问题]
- enum是C++中的宏变量还是整数变量
- v8::HandleScope::CreateHandle() # 中的致命错误无法在没有 HandleScope 的情
- Mac 上的 node-gyp 构建错误"calling a protected constructor of class 'v8::HandleScope'"
- v8::P ersistent 不会持久到包含 v8::HandleScope 的块之外
- v8在Windows上的HandleScope构造函数中的SegFault