我正在开发本机 Node.js 插件并关注nan docs
我将 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 (node.js:90:7)
gyp: Call to 'node -e "require('nan')"' returned exit status 1. while trying …Run Code Online (Sandbox Code Playgroud) 我有两个简单的类A和B我试图在node.js中的本机模块中暴露 A是可直接创建的,但是B只能通过调用创建A::foo().
class Internal {};
class B {
public:
Internal internal;
explicit B(Internal internal):internal(internal){}
};
class A {
public:
A() : internal() {};
B foo() { return B(internal); }
private:
Internal internal;
};
Run Code Online (Sandbox Code Playgroud)
我希望能够写:
const M = require('node_nan_minimal');
const a = new M.A();
const b = a.foo();
Run Code Online (Sandbox Code Playgroud)
为此,我创建了两个派生类 Nan::ObjectWrap
class AWrapper : public Nan::ObjectWrap { ... }
class BWrapper : public Nan::ObjectWrap { ... }
Run Code Online (Sandbox Code Playgroud)
每个包含一个A或B分别的实例.有了这些,我可以在javascript中创建一个A类型的对象,但是我在实现时遇到了麻烦AWrapper::foo …
该v8::FunctionCallbackInfo级区分This和Holder。我知道thisJavaScript中的内容,并假设这This反映了该设置。但是我对什么Holder是一个模糊的概念,对于何时应该使用Holder而不是却一无所知This。
特别是,在编写基于nan的node.js扩展并解包时ObjectWrap,我应该通过哪些?
当前node::ObjectWrap文档中有使用示例,Holder而当前Nan::ObjectWrap文档中使用This,因此“仅遵循文档中的示例”无助于回答这个问题。
我正在为 C++ 库构建一个节点模块包装器,以通过Nan将日志信息传递给 JavaScript。为此,可以使用 NAN_Method 来注册回调。回调处理程序必须通过vlAddLogListener(). 的LoggingCallbackHandler在函数从库接收到一个消息dispatchEvent,一个C ++函数。如果我收到日志,我想调用 JavaScript 回调来传递数据。
该函数dispatchEvent不是在 Nan 上下文中调用的,因此我没有范围/上下文,也无法访问 v8。如何调用 JavaScript 回调?
代码如下所示:
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 and call the JavaScript callback
v8::Local<v8::Function> f = v8::Local<v8::Function>::New(Nan::GetCurrentContext()->Global()->GetIsolate(), _cb); …Run Code Online (Sandbox Code Playgroud) 我有一个使用Nan用C++编写的Node.js插件.工作非常好.但是,我无法弄清楚如何让我的Node Javascript代码将任意数据对象(例如{attr1:42, attr2:'hi', attr3:[5,4,3,2,1]})传递给C++插件.
到目前为止,我通过调用JSON.stringify()我的数据对象然后在C++端解析字符串化的JSON来解决这个问题.
理想情况下,我想避免复制数据,只是获取对我可以访问的数据对象的引用,或者至少本地复制它并避免字符串化/解析...
任何帮助,将不胜感激!
所以最近我一直在使用 C++ 进入 OpenCV。我已经建立了一些我想导出到 Nodejs 的库和应用程序,但我终生无法弄清楚。
我试图在下面的这个 repo 中查看他是如何做到的,但是特别是因为这是我的第一个附加组件。 https://github.com/peterbraden/node-opencv/blob/master/binding.gyp
我不介意它与 NAN 或 N-API 一起使用,我只是希望有一些简单易懂的东西,可以看到什么发生在何处以及为什么发生。
这是一个简单的 OpenCV 函数,它只打开一个图像,我试图将其用作 Node 的插件:
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int ShowImage()
{
String imageName("./image.png");
Mat image;
image = imread(imageName, IMREAD_COLOR);
namedWindow("Display window", WINDOW_AUTOSIZE);
imshow("Display window", image);
waitKey(0);
}
Run Code Online (Sandbox Code Playgroud) 我想从异步插件函数中调用nodejs回调.我已经看到了同步示例(这里),我正在使用一个很棒的异步示例(这里)作为起始基础.
但是,当我尝试执行给c ++ AsyncWorker子类的回调时,我收到了Segmentation错误.
这是我的代码:
#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 after
// ------------------------
Local<Value> argv[] = {
New<v8::Number>(id)
};
// -------------------------
// Segmentation fault before
// -------------------------
cbs["getUser"]->Call(1, argv);
}
private:
std::string script;
std::map<std::string, Callback*> cbs; …Run Code Online (Sandbox Code Playgroud) 我使用Nan调查本机Node插件.
所以我试图用以下代码返回Node一个字符串数组:
NAN_METHOD(open) {
Local<Array> v8Array = Nan::New<Array>();
std::string str = "erwer";
v8Array->Set(0, Nan::New<String>(str.c_str()) );
//v8Array->Set(0, Nan::New<Integer>(12) );
info.GetReturnValue().Set(v8Array);
}
Run Code Online (Sandbox Code Playgroud)
但它没有编译:
error: no matching function for call to ‘v8::Array::Set(int, Nan::imp::MaybeFactoryBase<v8::String>::return_t)’
v8Array->Set(0, Nan::New<String>(str.c_str()) );
但是将项添加为整数(注释行)可以正常工作.为什么我不能在数组中添加字符串?
node.js-nan ×8
c++ ×7
node.js ×7
javascript ×3
v8 ×2
asynchronous ×1
json ×1
node-gyp ×1
node.js-napi ×1
npm ×1
opencv ×1