问题描述
我的目标是在Node.js中运行一个函数并提供一个字符串作为参数/参数:
const myAddon = require('path'); myAddon.myFunc(otherData,"Hello World");
根据堆栈溢出的答案,我尝试的操作如下:
v8::String::Utf8Value STR_ARG(args[1]->ToString());
std::string USER_MESSAGE = std::string(*STR_ARG);
这不起作用,我收到此错误消息:
ToString函数不接受0个参数。
我应该为函数提供任何输入吗?如果是,那是什么?
解决方法
我在“问题”中尝试使用的解决方案无法正常工作。如果它也不适合您,这是对我有用的代码。
v8::Local<v8::String> argsINPUT;
argsINPUT = args[0].As<v8::String>();
//Having a Second Argument to determine the Buffer Size is Optional but Optimal
//new char[insert any int] is also okay,but it should be large enough to hold the Data
char* args_buffer = new char[args[1].As<Number>()->Value()];
//If the Next Line thows an Error try out '(argsINPUT*)' instead of 'argsINPUT'
argsINPUT->WriteUtf8(isolate,args_buffer);
static std::string finalString;
finalString.assign(args_buffer);
delete args_buffer;
args.GetReturnValue().Set(String::NewFromUtf8(
isolate,finalString.c_str()).ToLocalChecked());
Cybafelo的积分:
Convert std::string to v8::string and viceversa?
Botje也帮助我采用了我的原始方法
编辑:args[1].As<Number>()->Value()
可能作为缓冲区大小最佳的原因:
js代码示例:
const myAddon = require('path');
const myString = "Hello World";
myAddon.myFunc(myString,myString.length + 1);
正如您所看到并可能知道的那样,Js为我们提供了属性和函数,其中之一就是length属性,因此我们可以直接创建一个大小完美的Buffer。 +1在末尾,因为我不确定我们是否也需要为“ \ 0”提供空间