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());
}
我正在使用 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());
}