Is there a way to call JS functions from C++ through node.js (as callbacks or something like that)? If yes, how? I\'m searching for it on the web, but haven\'t found any hel
One way to do it form a native addon can be using the provided function as a callback, for example let's gonna assume that you have a function named setPrintFunction() declared in your native environment (A native addon):
(Call this for example main.cc)
#include
#include
v8::Persistent fn;
// Call this at any time, but after the capture!
void printToNode(std::string msg) {
auto isolate = fn->GetIsolate();
// This part is the one that transforms your std::string to a javascript
// string, and passes it as the first argument:
const unsigned argc = 1;
auto argv[argc] = {
v8::String::NewFromUtf8(isolate,
msg.c_str(),
v8::NewStringType::kNormal).ToLocalChecked()
};
cb->Call(context, Null(isolate), argc, argv).ToLocalChecked();
}
// This is your native function that captures the reference
void setPrintFunction(const v8::FunctionCallbackInfo& args) {
auto isolate = args.GetIsolate();
auto context = isolate->GetCurrentContext();
auto cb = v8::Local::Cast(args[0]);
fn = v8::Persistent::New(cb);
}
// This part exports the function
void Init(v8::Local exports, v8::Local module) {
NODE_SET_METHOD(module, "exports", setPrintFunction);
}
NODE_MODULE(NODE_GYP_MODULE_NAME, Init)
Then, just importing your addon and using it like:
(Call this for example index.js)
const { setPrintFunction } = require('');
function printNodeMsg(msg) {
console.log(': ' + msg);
}
setPrintFunction(printNodeMsg);
So what you're basically doing is capturing the reference to the v8::Function (Which is the javascript function, but in the native environment) and then invoking it and passing "Hello World!" as the first (and unique) parameter.
More on the subject: https://nodejs.org/api/addons.html