NodeJS - V8和JS的参数类型转换

参考文章

http://taobaofed.org/blog/2016/09/20/type-casts-between-node-and-cpp/

https://nodejs.org/dist/latest-v8.x/docs/api/addons.html


Addons的机制,允许我们在js和c++互相调用,经常会传递参数或者返回结果,这时候需要做类型转换。包括js -> v8, 和 V8-> js。

1、js -> v8方向

#include <node.h>
#include <v8.h>
#include <iostream>

using namespace v8;
using namespace std;

void GetArguments(const FunctionCallbackInfo<Value>& args) {
    Isolate* isolate = args.GetIsolate();

    printf("Hello GetArguments\n");

    if (args.Length() == 0) {
        isolate->ThrowException(Exception::TypeError(
                String::NewFromUtf8(isolate, "Wrong number of arguements")));
        return;
    }

    if (!args[0]->IsNumber()) {
        printf("I am not Number \n");
        return;
    }

    Local<Number> value1 = Local<Number>::Cast(args[0]);
    cout << "first argument = " << value1->NumberValue() << endl;

    Local<String> value2 = Local<String>::Cast(args[1]);
    String::Utf8Value utfValue(value2);
    cout << "second argument = " << string(*utfValue) << endl;
}

void init(Local<Object> exports) {
    NODE_SET_METHOD(exports, "getArgs", GetArguments);
}

NODE_MODULE(addon, init)

执行 node-gyp configure build,编译cc文件。

在js文件中测试,

const addon =  require('./build/Release/addon-test');

console.log("This should be eight:" + JSON.stringify(addon.getArgs(12, "Hello")));
day
打印为:

Hello GetArguments
first argument = 12
second argument = Hello

可以看到,js中的参数已经传递到了v8的c++代码,并转换成了V8的类型。


2. v8->js方向

#include <node.h>
#include <v8.h>

using namespace v8;

void MyFunction(const FunctionCallbackInfo<Value>& args) {
    Isolate* isolate = args.GetIsolate();
    args.GetReturnValue().Set(String::NewFromUtf8(isolate, "Hello MyFunction!"));
}

void TestValue(const v8::FunctionCallbackInfo<Value>& args) {
    Isolate* isolate = args.GetIsolate();

    printf("Hello TestValue \n");

    Local<Object> obj = Object::New(isolate);

    // Number type
    Local<Number> number = Number::New(isolate, 100);
    obj->Set(String::NewFromUtf8(isolate, "numValue"), number);

    // String type
    Local<String> str = String::NewFromUtf8(isolate, "Hello world!");
    obj->Set(String::NewFromUtf8(isolate, "strValue"), str);

    // Boolean type
    Local<Boolean> flag = Boolean::New(isolate, true);
    obj->Set(String::NewFromUtf8(isolate, "boolValue"), flag);

    // Array type
    Local<Array> array = Array::New(isolate);
    array->Set(0, Number::New(isolate, 0));
    array->Set(1, Number::New(isolate, 1));
    array->Set(2, Number::New(isolate, 2));
    array->Set(3, Number::New(isolate, 3));
    obj->Set(String::NewFromUtf8(isolate, "arrayValue"), array);

    // undefined type
    // Local<Value> und = Undefined(isolate);
    // obj->Set(String::NewFromUtf8(isolate, "undefinedValue"), und);

    // Null type
    // Local<Value> null = Null(isolate);
    // obj->Set(String::NewFromUtf8(isolate, "nullValue"), null);

    // Function type
    // Local<FunctionTemplate> ft = FunctionTemplate::New(isolate, MyFunction);
    // Local<Function> fn = ft->GetFunction();
    // fn->SetName(String::NewFromUtf8(isolate, "myFunction"));

    args.GetReturnValue().Set(obj);
}

void init(Local<Object> exports) {
    NODE_SET_METHOD(exports, "getTestValue", TestValue);
}

NODE_MODULE(add, init);

js测试代码:

const addon =  require('./build/Release/addon-test');

console.log("This should be eight:" + JSON.stringify(addon.getTestValue()));

生成结果为:

Hello TestValue
This should be eight:{"numValue":100,"strValue":"Hello world!","boolValue":true,"arrayValue":[0,1,2,3]}


可以看出,c++中的数据也传到了js层,并对应着不同的类型。




  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,可以在服务器端运行JavaScript代码。它不同于传统的浏览器端JavaScript,而是提供了一个独立的运行时环境,使得JavaScript可以直接在服务器端运行。 Node.js可以解析和执行JavaScript代码,它使用V8引擎将JavaScript代码换为机器码,并在服务器端执行。这种能力使得开发者可以利用JavaScript的特性来编写服务器端程序,构建高性能、可伸缩的应用。 Node.js的特点之一是非阻塞式的I/O模型,这意味着它可以同时处理大量的并发请求,而不会因为等待I/O操作而阻塞线程。这种特性使得Node.js非常适合开发实时应用、高并发的网络服务器和Web应用。同时,Node.js还提供了许多内置模块和第三方模块,使得开发者可以方便地构建各种类型的服务器应用。 除了在服务器端运行JavaScript,Node.js还可以作为构建工具和间件平台来使用。通过使用Node.js的包管理器npm,开发者可以方便地安装、使用和分享JavaScript的包和模块。同时,Node.js还支持开发构建工具、自动化任务和前端开发工具等。 总而言之,Node.js是一个在服务器端运行JavaScript的运行环境,它提供了解析和执行JavaScript代码的能力,并通过非阻塞式的I/O模型实现高性能的服务器应用。其灵活性、高效性和生态系统的丰富性使得Node.js成为了广泛应用的服务器端开发工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值