插件通常会开放一些对象和函数,供运行在 Node.js 中的 JavaScript 访问。 当从 JavaScript 调用函数时,输入参数和返回值必须与 C/C++ 代码相互映射。

    以下例子描述了如何读取从 JavaScript 传入的函数参数与如何返回结果:

    1. // addon.cc
    2. #include <node.h>
    3. namespace demo {
    4. using v8::Exception;
    5. using v8::FunctionCallbackInfo;
    6. using v8::Isolate;
    7. using v8::Local;
    8. using v8::Number;
    9. using v8::Object;
    10. using v8::String;
    11. using v8::Value;
    12. // 这是 "add" 方法的实现。
    13. // 输入参数使用 const FunctionCallbackInfo<Value>& args 结构传入。
    14. void Add(const FunctionCallbackInfo<Value>& args) {
    15. Isolate* isolate = args.GetIsolate();
    16. // 检查传入的参数的个数。
    17. if (args.Length() < 2) {
    18. // 抛出一个错误并传回到 JavaScript。
    19. isolate->ThrowException(Exception::TypeError(
    20. String::NewFromUtf8(isolate,
    21. "参数的数量错误").ToLocalChecked()));
    22. return;
    23. }
    24. // 检查参数的类型。
    25. if (!args[0]->IsNumber() || !args[1]->IsNumber()) {
    26. isolate->ThrowException(Exception::TypeError(
    27. String::NewFromUtf8(isolate,
    28. "参数错误").ToLocalChecked()));
    29. return;
    30. }
    31. // 执行操作
    32. double value =
    33. args[0].As<Number>()->Value() + args[1].As<Number>()->Value();
    34. Local<Number> num = Number::New(isolate, value);
    35. // 设置返回值 (使用传入的 FunctionCallbackInfo<Value>&)。
    36. args.GetReturnValue().Set(num);
    37. }
    38. void Init(Local<Object> exports) {
    39. NODE_SET_METHOD(exports, "add", Add);
    40. }
    41. NODE_MODULE(NODE
    42. _GYP_MODULE_NAME, Init)
    43. } // 命名空间示例

    但已被编译,示例插件就可以在 Node.js 中引入和使用:

    1. // test.js
    2. const addon = require('./build/Release/addon');
    3. console.log('This should be eight:', addon.add(3, 5));