我试图弄清楚如何在 C 库和 NodeJS 模块之间传递数据。我可以通过 NodeFFI 模块执行此操作吗?
或者我是否必须编写自己的 NodeJS 插件来开发 C-NodeJS 接口?
我有一个本机NodeJS插件,它接受一个Buffer实例作为其中一个参数.
我可以使用以下代码将char数组转换为a Buffer,但是寻找相反的方法.
static v8::Local<v8::Object> create_buffer(char *data, unsigned long length) {
node::Buffer *slow_buffer = node::Buffer::New(length);
memcpy(node::Buffer::Data(slow_buffer), data, length);
v8::Handle<v8::Value> constructor_arguments[3] = {
slow_buffer->handle_,
v8::Integer::New(length),
v8::Integer::New(0)
};
v8::Local<v8::Object> global_object = v8::Context::GetCurrent()->Global();
v8::Local<v8::Function> buffer_constructor = v8::Local<v8::Function>::Cast(global_object->Get(v8::String::New("Buffer")));
return buffer_constructor->NewInstance(3, constructor_arguments);
}
Run Code Online (Sandbox Code Playgroud) 你好V8程序员和节点gyp'ers.我跑OS X 10.12.6,Node v6.11.1有npm v3.10.10,nan v2.6.2,gcc为的XCode与此版本输出的一部分:
$ > gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
Run Code Online (Sandbox Code Playgroud)
请帮助我了解如何正确使用NewInstance方法和过程中消除警告npm install或node-gyp rebuild我的自定义程序包安装的过程吗?
> node-gyp rebuild
CXX(target) Release/obj.target/cellcrypt/src/cellcrypt.o
CC(target) Release/obj.target/cellcrypt/src/decode.o
CXX(target) Release/obj.target/cellcrypt/src/DecryptionWrapper.o
../src/DecryptionWrapper.cpp:55:44: warning: 'NewInstance' is deprecated [-Wdeprecated-declarations]
v8::Local<v8::Object> instance = cons->NewInstance();
^
/Users/sjcbsolo/.node-gyp/6.11.1/include/node/v8.h:3276:52: note: 'NewInstance' has been explicitly marked deprecated here
V8_DEPRECATED("Use maybe version", Local<Object> NewInstance() const);
^
1 warning generated. …Run Code Online (Sandbox Code Playgroud) 我正在尝试为 编写以下函数NAPI。
int addon::fakeAdd(int a, int b)
{
return a + b;
}
Napi::Number addon::addWrapped(const Napi::CallbackInfo &info)
{
Napi::Env env = info.Env();
if (info.Length() < 2 || !info[0].IsNumber() || !info[1].IsNumber())
{
auto x = Napi::TypeError::New(env, "You did not provide 2 numbers");
x.ThrowAsJavaScriptException();
}
Napi::Number num1 = info[0].As<Napi::Number>();
Napi::Number num2 = info[1].As<Napi::Number>();
int returnValue = addon::fakeAdd(num1.Int32Value(), num2.Int32Value());
return Number::New(env, returnValue);
}
Run Code Online (Sandbox Code Playgroud)
我将此函数导出为add. 当我使用参数(例如)从 javascript 调用它时,addon.add(1,2)一切都像魅力一样工作,我得到了正确的结果,即 3。现在我想处理用户没有向我的函数提供任何参数或(一个或两个)的情况参数不是数字。在这种情况下,我想抛出一条自定义消息(“您没有提供 2 个数字”)。但是,当我尝试在没有任何参数的情况下从 JavaScript 调用我的方法时,出现以下错误:
console.log(addon.add());
^
Error: A number …Run Code Online (Sandbox Code Playgroud)