Articles of node.js nan

使v8对象属性和方法对JS可见

我用node::ObjectWrap包装一个C ++对象,并且有一些定义如下的方法: auto tpl = NanNew<v8::FunctionTemplate>(New); tpl->SetClassName(NanNew("className")); tpl->InstanceTemplate()->SetInternalFieldCount(4); NanSetPrototypeTemplate(tpl, NanNew("method1") , NanNew<v8::FunctionTemplate>(Method1) , v8::ReadOnly); NanSetPrototypeTemplate(tpl, NanNew("method2") , NanNew<v8::FunctionTemplate>(Method2), v8::ReadOnly); NanSetPrototypeTemplate(tpl, NanNew("method3") , NanNew<v8::FunctionTemplate>(Method3) , v8::ReadOnly); NanSetPrototypeTemplate(tpl, NanNew("method4") , NanNew<v8::FunctionTemplate>(Method4), v8::ReadOnly); 一切都按预期工作,我可以通过以下方式在JS中创build对象的实例: var classInstance = new className(); 所有的方法工作得很好,但是当我尝试login函数: console.log(classInstance); 我期待看到像这样的东西: { method1 : [Native Function], method2 : [Native Function], method3 : [Native Function], method4 : [Native […]

使用node-nan在一个node.js模块中设置WindowsHookEx

我正在尝试创build一个Electron node.js应用程序,它可以使用全局键绑定执行某些function。 Electron中的全局键绑定API在游戏中不起作用,所以我需要创build一个监听这些低级别键事件的本地节点模块。 所以我使用node-gyp来编译visual studio 2015和nan的项目来提供节点和c ++之间的通信。 我已经设法让这个项目的两个方面分别工作(低级别的键绑定和node.js < – > nan通信),但是我很难将它们结合起来。 我也承认我有很less的经验与c + +(我没有写一个单一的c + +程序)。 #include "node_modules/nan/nan.h" using namespace std; using namespace Nan; HHOOK _hook; KBDLLHOOKSTRUCT kbdStruct; class KeyboardEventWorker : public AsyncProgressWorker { public: KeyboardEventWorker(Callback *callback, Callback *progress) : AsyncProgressWorker(callback), progress(progress) {} ~KeyboardEventWorker() {} LRESULT CALLBACK HookCallback(int nCode,WPARAM wParam,LPARAM lParam) { executionProgress->Send(reinterpret_cast<const char*>(nCode), […]

在尝试检索时,通过nan传递数组返回未定义

我目前正在使用他们的c ++ / v8系统为NodeJS编写一个本地插件,并试图从Javascript写入一个数组到C ++,然后再检索它。 每当我尝试从数组中检索一个值并将其返回时,它将返回一个空数组 – 正如我最近潜入c ++中,我不确定这是我的误解指针/ c ++基础或NodeJS c ++交互。 我的档案如下: functions.cc #include "functions.h" #include <node.h> #include <nan.h> using namespace std; using namespace v8; NAN_METHOD(nothing) { } NAN_METHOD(aString) { info.GetReturnValue().Set(Nan::New("This is a thing.").ToLocalChecked()); } NAN_METHOD(aBoolean) { info.GetReturnValue().Set(false); } NAN_METHOD(aNumber) { info.GetReturnValue().Set(1.75); } NAN_METHOD(anObject) { v8::Local<v8::Object> obj = Nan::New<v8::Object>(); Nan::Set(obj, Nan::New("key").ToLocalChecked(), Nan::New("value").ToLocalChecked()); info.GetReturnValue().Set(obj); […]

如何使用Nan :: MakeCallback从nodejs插件发送事件到JavaScript?

原谅我是Node和Nan的初学者。 现在,我想从nodejs插件发送事件到JavaScript。 v8::Local<v8::Object> obj Nan::Persistent<v8::Object> persistent; persistent.Reset(obj); v8::Local<v8::Object> orig_obj = Nan::New(persistent); v8::Local<v8::Value> argv[1] = {Nan::New("New Data").ToLocalChecked()}; Nan::MakeCallback(orig_obj, "emit", 1, argv); 但是,分割错误(核心转储)那么,如何使用Nan :: MakeCallback呢? 谢谢!

节点NAN:在AsyncWorker的Execute方法中调用GetFromPersistent

我正在为节点构build一个本地扩展,其中包含一个完成时的callback函数。 我正在传递一个节点缓冲区到通话。 它包含要由扩展处理的内容的有效载荷。 我应该能够将我的缓冲区存储在我的AsyncWorker的构造函数中的持久性存储中,并在需要时稍后检索它。 这个例子(来自nantesting套件)是我通常基于我的代码: https : //github.com/nodejs/nan/blob/master/test/cpp/bufferworkerpersistent.cpp 这个testing是有效的,但是直到HandleOKCallback方法对缓冲区没有任何作用,这对我来说并不是很有趣。 我需要在Execute方法中访问缓冲区。 如果我只是在testing的Execute()方法中添加一行来尝试访问缓冲区,如下所示: void Execute () { printf("before GetFromPersistent\n"); v8::Local<v8::Value> handle = GetFromPersistent("buffer"); printf("after GetFromPersistent\n"); printf("buffer @%llux len %ld\n", (uint64_t)node::Buffer::Data(handle), node::Buffer::Length(handle)); Sleep(milliseconds); } 我在GetFromPersistent调用中遇到seg错误。 我的问题是:我错过了什么? 我应该不能将一个持久对象拖入Execute方法吗? 如果是这样,为什么不呢?

将任意Javascript数据对象传递给Node.js C ++插件

我有一个用C ++编写的使用Nan的Node.js插件。 奇妙地工作。 然而,我一直没能弄清楚如何让我的节点的Javascript代码传递任意的数据对象(例如{attr1:42, attr2:'hi', attr3:[5,4,3,2,1]} )到C ++插件。 直到现在,我已经通过调用我的数据对象的JSON.stringify()来解决这个问题,然后parsingC ++端的string化的JSON。 理想情况下,我想避免复制数据,只是获得我可以访问的数据对象的引用,或者至less要本地复制它,并避免string化/parsing… 任何帮助,将不胜感激!

NodeJS Addon从NAN内部调用JavascriptcallbackAsyncWorker :: Execute

我想从我的asynchronous附加函数中调用nodejscallback。 我已经看到了同步的例子( 在这里 ),我正在使用一个奇妙的asynchronous例子( 在这里 )作为一个起点。 但是,当我尝试执行给c ++ AsyncWorker子类的callback时,出现分段错误。 这是我的代码: #include <nan.h> #include <functional> #include <iostream> #include <exception> using namespace Nan; using namespace v8; using namespace std; class ScriptWorker : public AsyncWorker { public: ScriptWorker(Callback *callback, const std::map<std::string, Callback*>) : AsyncWorker(callback), script(script), cbs(cbs) {} ~ScriptWorker() {} void Execute () { // ———————— // Segmentation fault […]

node.js Nan:在C ++函数中调用JavaScriptcallback

我正在为C ++库构build一个节点模块包装器来将日志信息通过Nan传递给JavaScript。 为此NAN_Method可用于注册callback。 callback处理程序必须通过vlAddLogListener()将其自身注册为C ++库中的callback。 LoggingCallbackHandler从库函数dispatchEvent (一个C ++函数)接收消息。 如果我收到日志,我想调用JavaScriptcallback来传递数据。 函数dispatchEvent不在Nan上下文中调用,因此我没有范围/上下文,也没有访问v8的权限。 如何调用JavaScriptcallback? 代码如下所示: NAN_METHOD(registerLoggingCallback) { v8::Isolate* isolate = info.GetIsolate(); v8::Local<v8::Function> fun = info[0].As<v8::Function>(); lch = new LoggingCallbackHandler(isolate, fun); } LoggingCallbackHandler::LoggingCallbackHandler(v8::Isolate* isolate, v8::Local<v8::Function> fun) : _cb(isolate, fun) { vlAddLogListener(&LoggingCallbackHandler::dispatchEvent, this); } void VL_CALLINGCONVENTION LoggingCallbackHandler::dispatchEvent(const char* eventData, void* clientData) { // here I want to process the data […]

错误:找不到模块“南”

我正在研究本地的Node.js插件和下面的nan文档 我将nan包含在binding.gyp中,如: "include_dirs" : [ "<!(node -e \"require('nan')\")" ] 另外nan是在npm的依赖关系。 但是当我在另一个节点模块中安装软件包时,node-gyp失败并报错 > nnb@1.0.2 install /Users/Shopgate/sandbox/stress/node_modules/nnb > node-gyp rebuild module.js:338 throw err; ^ Error: Cannot find module 'nan' at Function.Module._resolveFilename (module.js:336:15) at Function.Module._load (module.js:278:25) at Module.require (module.js:365:17) at require (module.js:384:17) at [eval]:1:1 at Object.exports.runInThisContext (vm.js:74:17) at Object.<anonymous> ([eval]-wrapper:6:22) at Module._compile (module.js:460:26) at evalScript (node.js:431:25) at startup […]

在C ++插件中的Node.js / Nancallback中不常发生Segfault

我正在做一个NodeJS插件使用Nan库,我遇到了一个问题,调用一个callback(在JavaScript方面创build,并传递给插件以asynchronous执行)将导致段错误 – 但只有一次10万左右跑。 在所有事情的运作方面都有相当的复杂性,但我希望有人会看到我错过的东西,或者能够弄清楚发生了什么。 C ++callback函数是这样从javascriptcallback中创build的: auto nodeFunc = val.As<v8::Function>(); auto nodeCb = std::make_shared<Nan::Callback>(nodeFunc); auto callback = [nodeCb] (std::string err, std::string val) -> void { Nan::HandleScope scope; v8::Local<v8::Value> argv[2]; if (err.length() == 0) { auto isolate = v8::Isolate::GetCurrent(); auto json = v8::JSON::Parse(isolate, Nan::New(val).ToLocalChecked()); auto object = json.ToLocalChecked(); argv[0] = Nan::Null(); argv[1] = object; } else […]