Node.js 插件无法转换参数

Node.js Addon cannot convert arguments

我正在使用 Node.js c++ Addons.

创建 字符串转换库

我知道我可以很容易地用 JavaScript 制作这个库,但我需要用 Node.js c++ Addons 来做。

根据这个答案 Converting from v8::Arguments to C++ Types. I have checked This answer 但它 returns 相同的错误

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

But there is an Error

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]

I tired to solve that but i'm failed, because i'm new to c++ addons. I also checked that error code C2664 which doesn't solve my problem.

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"));


请帮忙解决这个问题。 谢谢

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

1.首先将这段代码添加到targets

下的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());
}