标签: node.js-addon

Node.js和C/C++集成:如何正确实现回调?

我正在尝试实现与node.js集成的C++扩展.此扩展将在内部调用一些阻塞调用,因此它需要为node.js世界提供非阻塞接口.

https://nodejs.org/api/addons.html中所述,有两种方法可以实现非阻塞回调:

a)通过使用JavaScript函数的简单回调.所以我的扩展必须生成一个线程并立即返回,让该线程调用阻塞代码,然后在返回时调用JavaScript回调.这似乎相对简单.

b)通过使用libuv库,如果我理解正确,将事件发布到node.js事件循环.我没有详细阅读过libuv文档,但实现起来似乎相当复杂.

我的偏好当然是a),但我不知道其含义是什么.如果从不同的线程调用回调是否有任何问题,从而将node.js标准方法限制为非阻塞IO?或者是否需要使用libuv来正确处理我的代码及其阻塞调用的线程?

非常感谢您的帮助.

c++ multithreading node.js node.js-addon

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

node.js addon - 如何将字符串参数传递给(nan)C++

我的node.js代码执行此操作:

var MyMQ = require( './build/release/mqconn' ) ;
var MyQmgrName = 'QM_CNT' ; // req.params.qmgrname ; 
MyMQ.connect ( MyQmgrName, function ( err, result ) { 
Run Code Online (Sandbox Code Playgroud)

我的C++代码(uning nan)想要接收第一个字符串参数:

NAN_METHOD( MQ_Connect ) {

    NanScope();
    Local<Value> szQMN( args[ 0 ] );
    printf( "(cc)>>>> qmn [%s].\n", szQMN ) ;
Run Code Online (Sandbox Code Playgroud)

......但我得到的是垃圾.

我有什么不对的任何线索?塞巴斯蒂安.

c++ node.js node.js-addon ibm-mq

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

使用NAN将数组从node.js传递到c ++ v8

我使用NAN在node.js中包含一个c ++库.我理解如何在两者之间来回传递数字和字符串,但我不明白如何传递数组.我想做的是这样的事情:

index.js

var test = require('bindings')('test');

var buffer = [0,0,0,0,0,0.1,0,0,0,0,-0.1];
test.encode(buffer, buffer.length);
Run Code Online (Sandbox Code Playgroud)

test.cc

var encoder = new Encoder();

NAN_METHOD(Encode){

    //the next line is incorrect, I want to take the buffer array and pass it as a pointer to the encodeBuffer() function
    Local<Number> buffer = args[0].As<Number>();

    //get the integer value of the second argument
    Local<Number> buffer_length = args[1].As<Number>();
    int bl_int = buffer_length->IntegerValue();

    //call function
    encoder.encodeBuffer(buffer, bl_int);
}

void Init(Handle<Object> exports) {
  exports->Set(NanNew("encode"), NanNew<FunctionTemplate>(Encode)->GetFunction());
}
Run Code Online (Sandbox Code Playgroud)

我想在c ++库中使用的实际方法是:

void encodeBuffer(float …
Run Code Online (Sandbox Code Playgroud)

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

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

V8多线程功能

我正在编写一个Node插件,我在尝试从C++工作线程调用V8函数对象时遇到问题.

我的插件基本上启动了一个C++ std :: thread并使用WaitForSingleOject()进入等待循环,这是由写入一些共享内存的不同C++应用程序(一个X-Plane插件)触发的.我试图让我的Node插件在发出Windows共享事件时唤醒,然后调用我从节点应用程序注册的JavaScript函数,该函数将依次将源自X-Plane的数据传递回Node和网络世界.

我已经设法解决了如何注册JavaScript函数并从C++调用它,但仅限于主V8线程.我似乎找不到从std :: thread调用函数的方法.

我尝试了各种方法,Locker对象(变量成功),持久性函数(不起作用),保存主隔离对象,进入/退出隔离,但是如果/当代码最终到达函数对象时它无效.

我得到了不同的结果,从崩溃到冻结,取决于我是否创建了各种储物柜和解锁器对象.

我对V8完全不熟悉,所以我不确定我做的是什么.有问题的代码如下:

如果有人能够提供帮助,我将永远感激不尽!

float* mem = 0;
HANDLE event = NULL;
Isolate* thisIsolate;

void readSharedMemory()
{
    //Isolate* isolate = Isolate::GetCurrent();
    //HandleScope scope(isolate);

    thisIsolate->Enter();
    v8::Locker locker(thisIsolate);
    v8::Isolate::Scope isolateScope(thisIsolate);
    //HandleScope scope(thisIsolate);        

    //v8::Local<Value> myVal = v8::String::NewFromUtf8(isolate, "Plugin world");
    v8::Local<Value> myVal = v8::Number::New(thisIsolate, *mem);

    // If it get's this far 'myFunction' is not valid
    bool isFun = myFunction->IsFunction();
    isFun = callbackFunction->IsFunction();

    v8::Context *thisContext = *(thisIsolate->GetCurrentContext());
    myFunction->Call(thisContext->Global(), 1, &(Handle<Value>(myVal)));
}

void registerCallback(const FunctionCallbackInfo<Value>& args)
{
    Isolate* …
Run Code Online (Sandbox Code Playgroud)

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

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

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
查看次数

使用Nan在Node.js附加代码中创建数组

我正在编写Node插件并尽可能多地使用nan库来编写代码.Node项目推荐它,因为它允许您编写与不同版本的v8和节点兼容的代码.

但是,经过多次查看文档后,我还没有找到有关在nan API中处理数组的任何指导.对于基本任务,例如处理由Javascript代码作为参数传递的数组,或者在加载项中实例化新数组对象并将其返回到Javascript代码.我们是否应该直接使用v8::ArrayAPI.我希望API 的Nan :: New部分可以更好地处理这个问题.

我错过了什么吗?

javascript node.js node.js-addon

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

Node.js 脚本不退出

我是 Js 的菜鸟,但我试图通过编写 api 将文件从 irc 传输到我的服务器来让生活更轻松一些挖掘后,我得到了一个下载文件的模块(下面的代码基于 npm xdcc)但是当我运行该模块时它没有完成命令后退出 吐出“下载完成”后,我必须按 Ctrl+C 退出

var irc = require('xdcc').irc;
var ProgressBar = require('progress');
var progress;


var connectIRC = function (bot, pack) {
    var user = 'desu' + Math.random().toString(36).substr(7, 3);

    var start = 0;

    console.log('Connecting...');

    var client = new irc.Client('irc.rizon.net', user, {
        channels: ['#nibl'],
        userName: user,
        realName: user
    });

    client.on('join', function(channel, nick, message) {
        if (nick !== user) return;
        console.log('Joined', channel);
        client.getXdcc(bot, 'xdcc send #' + pack, '.');
    });

    client.on('xdcc-connect', function(meta) {
        console.log('Connected: ' …
Run Code Online (Sandbox Code Playgroud)

node.js node.js-addon

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

Nodejs C/C++ 会使用多个核心吗?

我知道一个事实,即在的NodeJS单个内核上运行。但是,如果我构建一个实现了多线程的 NodeJS C/C++ 插件会发生什么?这个插件会消耗一个以上的核心(应该是什么时候)?

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

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

从 NodeJS 到 C++ 我应该如何传递参数并获得结果

我正在尝试将我的旧 C++ 项目与 NodeJS 集成。我看过 hello word 插件教程将简单的文件 c++ 文件构建到 NodeJS 中。我正在寻找一些高级示例,如果有人致力于构建从 NodeJS 到 C++ 的桥梁。我想将数据从我的 nodeJS 程序(hello.js)传递到 C++ 程序(hello.cc)

感谢帮助

c++ node.js node.js-addon

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

node-gyp 未在 macos 上正确链接库

我正在开发一个节点插件,但在使用 node-gyp 构建后查找库时出现错误。

这是我的 binging.gyp 文件:

{
"targets": [{
    "target_name": "xaddon",
    "cflags!": [ "-fno-exceptions" ],
    "cflags_cc!": [ "-fno-exceptions" ],
    "sources": [
        "cppsrc/main.cc"
    ],
    'include_dirs': [
        "<!@(node -p \"require('node-addon-api').include\")", "lib"
    ],
    "libraries": ["<(module_root_dir)/lib/xaddon.so"],
    'dependencies': [
        "<!(node -p \"require('node-addon-api').gyp\")"
    ],
    'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ]
}]
}
Run Code Online (Sandbox Code Playgroud)

这正确构建,如果我将 so 文件放在项目的根文件夹中,则一切正常。但我想在 lib 文件夹中运行一个包含文件的项目。

这是我尝试在 lib 文件夹而不是根文件夹中运行项目 so 文件时出现的错误。

Error: dlopen(#PATH_TO_PROJECT#/build/Release/xaddon.node, 1): Library not loaded: xaddon.so
Referenced from: #PATH_TO_PROJECT#/build/Release/xaddon.node
Reason: image not found
Run Code Online (Sandbox Code Playgroud)

c++ node.js node-gyp node.js-addon

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