我正在使用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
#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)
}
const transformer = require('bindings')('transformer');
console.log(transformer.uppercase("Dinindu"));
<小时/> 请帮忙解决这个问题。 感谢。
答案 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());
}