标签: node.js-nan

错误:找不到模块“nan”

我正在开发本机 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)

node.js npm node-gyp node.js-nan node.js-addon

33
推荐指数
4
解决办法
3万
查看次数

如何从派生自Nan :: ObjectWrap的类返回本机对象?

我有两个简单的类AB我试图在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)

每个包含一个AB分别的实例.有了这些,我可以在javascript中创建一个A类型的对象,但是我在实现时遇到了麻烦AWrapper::foo …

javascript c++ node.js node.js-nan

9
推荐指数
1
解决办法
451
查看次数

这与ObjectWrap :: Unwrap的持有人

v8::FunctionCallbackInfo级区分ThisHolder。我知道thisJavaScript中的内容,并假设这This反映了该设置。但是我对什么Holder是一个模糊的概念,对于何时应该使用Holder而不是却一无所知This

特别是,在编写基于nan的node.js扩展并解包时ObjectWrap,我应该通过哪些?

当前node::ObjectWrap文档中有使用示例,Holder当前Nan::ObjectWrap文档中使用This,因此“仅遵循文档中的示例”无助于回答这个问题。

c++ v8 node.js node.js-nan node.js-addon

5
推荐指数
1
解决办法
410
查看次数

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

我正在为 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)

javascript c++ node.js node.js-nan node.js-addon

5
推荐指数
1
解决办法
2346
查看次数

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

我有一个使用Nan用C++编写的Node.js插件.工作非常好.但是,我无法弄清楚如何让我的Node Javascript代码将任意数据对象(例如{attr1:42, attr2:'hi', attr3:[5,4,3,2,1]})传递给C++插件.

到目前为止,我通过调用JSON.stringify()我的数据对象然后在C++端解析字符串化的JSON来解决这个问题.

理想情况下,我想避免复制数据,只是获取对我可以访问的数据对象的引用,或者至少本地复制它并避免字符串化/解析...

任何帮助,将不胜感激!

javascript c++ json node.js node.js-nan

5
推荐指数
1
解决办法
1564
查看次数

将 OpenCV C++ 附加组件添加到 node.js 的最基本示例

所以最近我一直在使用 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)

c++ opencv node.js node.js-nan node.js-napi

5
推荐指数
1
解决办法
1742
查看次数

NodeJS Addon从NAN AsyncWorker :: Execute内部调用Javascript回调

我想从异步插件函数中调用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)

c++ asynchronous node.js node.js-nan node.js-addon

3
推荐指数
1
解决办法
3552
查看次数

将字符串设置为v8 Array

我使用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()) );

但是将项添加为整数(注释行)可以正常工作.为什么我不能在数组中添加字符串?

c++ v8 node.js-nan

1
推荐指数
1
解决办法
1384
查看次数