如何使用C ++插件中的模块中构build的node.js

我需要使用我的C ++插件模块“crypto”中构build的node.js。 我试图find使用内置模块的C ++插件的例子,但失败了。 我查看了node_crypto.h / .cc,它与node.jsencryption文档,受保护的构造函数等有着不同的函数签名。node_crypto.h包含一个参数的InitCrypto()声明,但是node_crypto.cc没有定义这样的function。 只有InitCrypto有四个参数。 无论如何,我试着用一个参数使用InitCrypto,并得到“符号查找错误”。

我可以将require('crypto')的结果传递给我的插件,然后使用这个对象,但这是不安全的。 我们的JS代码在客户端的服务器上工作。

现在我认为C ++插件使用像openssl lib这样的smth,而不是内置在节点模块“crypto”中更简单。

所以我需要一些使用'crypto'模块的C ++插件的工作例子,或者链接到一些关于这个的文章。

任何使用C ++插件中的内置模块的例子都是有帮助的。

当需要对Nodejs插件中的数据进行encryption/解密时,我使用了相同的方法。

据我所知,来自node_crypto.h类用于在Nodejs中进行本地绑定,我无法在我的插件中使用它们。

然后,我尝试从Nodejs使用OpenSSL,但不能这样做,因为OpenSSL静态链接到Nodejs可执行文件。

之后,我尝试从C ++调用JavaScript代码,最后得到以下解决scheme – 从C ++代码调用Nodejs函数:

 using namespace v8; // persistent handle for the crypto module static Persistent<Object> node_crypto; // Addon startup procedure void Init(Local<Object> exports, Local<Object> module) { Isolate* isolate = Isolate::GetCurrent(); HandleScope scope(isolate); // get `require` function Local<Function> require = module->Get(String::NewFromUtf8(isolate, "require")).As<Function>(); // call require('crypto') Local<Value> args[] = { String::NewFromUtf8(isolate, "crypto") }; Local<Object> crypto = require->Call(module, 1, args).As<Object>(); // store crypto module in persistent handle for further use node_crypto.Reset(isolate, crypto); } NODE_MODULE(addon, Init); // must be invoked in then Node main thread since the function uses V8 API std::string encrypt(std::string const& key, std::string const& text) { Isolate* isolate = Isolate::GetCurrent(); HandleScope scope(isolate); // get local handle from persistent Local<Object> crypto = Local<Object>::New(isolate, node_crypto); // get `createCipher` function from the crypto module Local<Function> createCipher = crypto->Get(String::NewFromUtf8(isolate, "createCipher")).As<Function>(); // call crypto.createCipher("aes256", key) Local<Value> create_args[] = { String::NewFromUtf8(isolate, "aes256"), String::NewFromUtf8(isolate, key.c_str()) }; Local<Object> cipher = createCipher->Call(crypto, 2, create_args).As<Object>(); // get update and final functions from the crypto module Local<Function> update = cipher->Get(String::NewFromUtf8(isolate, "update")).As<Function>(); Local<Function> final = cipher->Get(String::NewFromUtf8(isolate, "final")).As<Function>(); // buf1 = cipher.update(text), buf2 = cipher.final() Local<Value> update_args[] = { node::Buffer::New(isolate, text.data(), text.size()) }; Local<Value> buf1 = update->Call(cipher, 1, update_args); Local<Value> buf2 = final->Call(cipher, 0, nullptr); // concatenate update and final buffers into result string char const* const data1 = node::Buffer::Data(buf1); char const* const data2 = node::Buffer::Data(buf2); size_t const size1 = node::Buffer::Length(buf1); size_t const size2 = node::Buffer::Lenght(buf2); std::string result; result.reserve(size1 + size2); result.append(data1, size1); result.append(data2, size2); return result; } std::string decrypt(std::string const& key, std::string const& text) { // similar as in encrypt, use createDecipher instead } 

正如你所看到的,使用V8 API的C ++代码非常冗长。 在真正的项目中,我使用v8pp库中的实用程序函数来获取对象属性和调用函数,并将数据转换为V8句柄。