Node.js Addon无法转换参数

时间:2017-03-05 16:58:48

标签: c++ node.js v8 node.js-addon

我正在使用Node.js c++ Addons制作字符串转换库

我知道我很容易用JavaScript创建这个库,但我需要用Node.js c++ Addons来完成。

根据这个答案Converting from v8::Arguments to C++ Types。我已经检查了This answer,但它返回了相同的错误

所以我声明void uppercase将一些String转换为大写。

  

但有错误

D:\transformer\src\transformer.cc(30): error C2664: 'std::string Transformation::toUpperCase(std::string)': cannot convert argument 1 from 'v8::Local<v8::String>' to 'std::string'  [D:\transformer\build\transformer.vcxproj]
     

我厌倦了解决这个问题,但我失败了,因为我是c ++插件的新手。我还检查了错误代码C2664并没有解决我的问题。

transformer.cc

// transformer.cc
#include <node.h>
#include <iostream>
#include <algorithm>

using namespace v8;
using namespace std;

namespace Transformations {

    string toUpperCase(string str) {
        transform(str.begin(), str.end(), str.begin(), ::toupper);
        return str;
    }

}

namespace Transformer {

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

        Local<String> str = Local<String>::Cast(args[0]);

        if(!args[0]->IsString()) {
            isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Wrong arguments")));
            return;
        }

        args.GetReturnValue().Set(Transformations::toUpperCase(str));
    }

    void lowercase(const FunctionCallbackInfo<Value>& args) { }

    void capitalize(const FunctionCallbackInfo<Value>& args) { }

    void reverse(const FunctionCallbackInfo<Value>& args) { }

    void init(Local<Object> exports) {
        NODE_SET_METHOD(exports, "uppercase", uppercase);
        NODE_SET_METHOD(exports, "lowercase", lowercase);
        NODE_SET_METHOD(exports, "capitalize", capitalize);
        NODE_SET_METHOD(exports, "reverse", reverse);
    }

    NODE_MODULE(transformer, init)

}

test.js

const transformer = require('bindings')('transformer');

console.log(transformer.uppercase("Dinindu"));

<小时/> 请帮忙解决这个问题。 感谢。

1 个答案:

答案 0 :(得分:0)

我在这里找到了解决方案,Native Abstractions(nan)解决了我的问题。

<强> 1。首先将此代码添加到目标

下的binding.gyp文件中
"include_dirs" : ["<!(node -e \"require('nan')\")"]

<强> 2。安装nan后,通过在transformer.cc

的头部添加此行来导入它
#include <nan.h>

第3。现在,稍微改变我们的uppercase功能:

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

    v8::String::Utf8Value value(args[0]->ToString());
    std::string name = std::string(*value);
    std::string uppercased_name = Transformations::toUpperCase(name);

    if(!args[0]->IsString()) {
        isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Wrong arguments")));
        return;
    }

    args.GetReturnValue().Set(Nan::New(uppercased_name).ToLocalChecked());
}