无法在 "callback" 函数中访问 V8 上下文
Can't access V8 Context in "callback" function
我正在编写一个 NodeJS 插件,我在其中使用了一个 C 库,它允许您在某些事件中注册回调。当触发回调时,我想调用一个 NodeJS 回调函数。问题是在我的 C 回调函数中,当我尝试做任何与 V8 相关的事情时遇到分段错误,比如创建 HandleScope。
在test.js中:
...
myaddon.register(function(data) {
console.log("data: " + JSON.stringify(data));
});
...
在test.c中:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <node.h>
#include <v8.h>
using namespace v8;
void WINAPI myEvent(int num, void * context) {
HandleScope scope; // Segmentation fault here!
Local<Function> * cb = (Local<Function>*)(context);
Local<Object> obj = Object::New();
obj->Set(String::NewSymbol("id"), Number::New(num));
const int argc = 1;
Local<Value> argv[argc] = { obj };
(*cb)->Call(Context::GetCurrent()->Global(), argc, argv);
sleep(1);
}
Handle<Value> RegisterEvent(const Arguments& args) {
HandleScope scope;
Local<Function> cb = Local<Function>::Cast(args[0]);
int callbackId = registerEvent((Event)&myEvent, &cb );
printf("callback id: %i\n", callbackId);
init();
return scope.Close(Integer::New(callbackId));
}
void init(Handle<Object> exports) {
exports->Set(String::NewSymbol("register"),
FunctionTemplate::New(RegisterEvent)->GetFunction());
}
NODE_MODULE(test, init)
编辑:更新为真实代码。
编辑:我刚刚更改了这个问题的标题,因为问题可能是我的回调函数无法访问 V8 上下文。因为我在创建 HandleScope 实例时遇到分段错误,所以我看不到它可能是什么。除了这个问题,我还试图在 V8 文档中找到答案,但它很大,我没有那么多时间来测试和调查。
看来您可能忘记为您的变量创建 HandleScope
。这应该适合你。
void callbackFunc() {
HandleScope scope;
Local<Object> obj = Object::New();
}
您的处理函数 myEvent()
必须在 V8 线程中调用。如果没有,你必须post把事件通知放到V8线程中:
我正在编写一个 NodeJS 插件,我在其中使用了一个 C 库,它允许您在某些事件中注册回调。当触发回调时,我想调用一个 NodeJS 回调函数。问题是在我的 C 回调函数中,当我尝试做任何与 V8 相关的事情时遇到分段错误,比如创建 HandleScope。
在test.js中:
...
myaddon.register(function(data) {
console.log("data: " + JSON.stringify(data));
});
...
在test.c中:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <node.h>
#include <v8.h>
using namespace v8;
void WINAPI myEvent(int num, void * context) {
HandleScope scope; // Segmentation fault here!
Local<Function> * cb = (Local<Function>*)(context);
Local<Object> obj = Object::New();
obj->Set(String::NewSymbol("id"), Number::New(num));
const int argc = 1;
Local<Value> argv[argc] = { obj };
(*cb)->Call(Context::GetCurrent()->Global(), argc, argv);
sleep(1);
}
Handle<Value> RegisterEvent(const Arguments& args) {
HandleScope scope;
Local<Function> cb = Local<Function>::Cast(args[0]);
int callbackId = registerEvent((Event)&myEvent, &cb );
printf("callback id: %i\n", callbackId);
init();
return scope.Close(Integer::New(callbackId));
}
void init(Handle<Object> exports) {
exports->Set(String::NewSymbol("register"),
FunctionTemplate::New(RegisterEvent)->GetFunction());
}
NODE_MODULE(test, init)
编辑:更新为真实代码。
编辑:我刚刚更改了这个问题的标题,因为问题可能是我的回调函数无法访问 V8 上下文。因为我在创建 HandleScope 实例时遇到分段错误,所以我看不到它可能是什么。除了这个问题,我还试图在 V8 文档中找到答案,但它很大,我没有那么多时间来测试和调查。
看来您可能忘记为您的变量创建 HandleScope
。这应该适合你。
void callbackFunc() {
HandleScope scope;
Local<Object> obj = Object::New();
}
您的处理函数 myEvent()
必须在 V8 线程中调用。如果没有,你必须post把事件通知放到V8线程中: