我正在尝试实现与node.js集成的C++扩展.此扩展将在内部调用一些阻塞调用,因此它需要为node.js世界提供非阻塞接口.
如https://nodejs.org/api/addons.html中所述,有两种方法可以实现非阻塞回调:
a)通过使用JavaScript函数的简单回调.所以我的扩展必须生成一个线程并立即返回,让该线程调用阻塞代码,然后在返回时调用JavaScript回调.这似乎相对简单.
b)通过使用libuv库,如果我理解正确,将事件发布到node.js事件循环.我没有详细阅读过libuv文档,但实现起来似乎相当复杂.
我的偏好当然是a),但我不知道其含义是什么.如果从不同的线程调用回调是否有任何问题,从而将node.js标准方法限制为非阻塞IO?或者是否需要使用libuv来正确处理我的代码及其阻塞调用的线程?
非常感谢您的帮助.
我的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)
......但我得到的是垃圾.
我有什么不对的任何线索?塞巴斯蒂安.
我使用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) 我正在编写一个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) 我想从异步插件函数中调用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) 我正在编写Node插件并尽可能多地使用nan库来编写代码.Node项目推荐它,因为它允许您编写与不同版本的v8和节点兼容的代码.
但是,经过多次查看文档后,我还没有找到有关在nan API中处理数组的任何指导.对于基本任务,例如处理由Javascript代码作为参数传递的数组,或者在加载项中实例化新数组对象并将其返回到Javascript代码.我们是否应该直接使用v8::ArrayAPI.我希望API 的Nan :: New部分可以更好地处理这个问题.
我错过了什么吗?
我是 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) 我知道一个事实,即在的NodeJS单个内核上运行。但是,如果我构建一个实现了多线程的 NodeJS C/C++ 插件会发生什么?这个插件会消耗一个以上的核心(应该是什么时候)?
我正在尝试将我的旧 C++ 项目与 NodeJS 集成。我看过 hello word 插件教程将简单的文件 c++ 文件构建到 NodeJS 中。我正在寻找一些高级示例,如果有人致力于构建从 NodeJS 到 C++ 的桥梁。我想将数据从我的 nodeJS 程序(hello.js)传递到 C++ 程序(hello.cc)
感谢帮助
我正在开发一个节点插件,但在使用 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) node.js ×10
node.js-addon ×10
c++ ×8
javascript ×2
node-gyp ×2
v8 ×2
asynchronous ×1
ibm-mq ×1
node.js-nan ×1