Я поддерживаю надстройку Node.js в C ++.
Мне нужно вызвать синтаксический анализатор SQL (на самом деле очень нестандартный вариант SQL) внутри асинхронно вызываемой функции C ++, нок сожалению (для меня), этот парсер был реализован в Javascript с использованием некоторых библиотек Node.js (используется функция require
);это пример кода JavaScript, который мне нужно выполнить:
require("./util/SqlParser")("SELECT 1 FROM DUAL").getSyntaxTree()
Я пытался написать что-то вроде этого:
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::Local<v8::Context> context = isolate->GetCurrentContext();
v8::TryCatch trycatch;
v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate
,
"require(\"./util/SqlParser\")(\"SELECT 1 FROM DUAL\").getSyntaxTree()"
,
v8::NewStringType::kNormal).ToLocalChecked()
;
v8::Local<v8::Script> script = v8::Script::Compile(context, source).ToLocalChecked();
v8::MaybeLocal<v8::Value> result = script->Run(context);
if( result.IsEmpty() )
{
v8::Local<v8::Value> exc = trycatch.Exception();
if( !exc.IsEmpty() )
{
auto msg = exc->ToString();
if( !msg.IsEmpty() )
throw std::string( *v8::String::Utf8Value(msg) );
}
throw "unknown error in called js function";
}
Но, к сожалению, это не работает.Конечным результатом является сообщение об ошибке "ReferenceError: require is not defined"
: очевидно, мой контекст ничего не знает о Node.js.
Я пытался обернуть вышеупомянутое выражение в функцию js parseSqlText
, но эта функцияв равной степени неизвестен исполнителю сценария (я получаю сообщение об ошибке "ReferenceError: parseSqlText is not defined"
).
Мой вопрос: есть ли способ обойти это?
Любая помощь будет очень признательна.Я был бы очень рад избежать повторной реализации этого синтаксического анализатора в C ++ ... который в настоящее время кажется единственным жизнеспособным способом сделать то, что мне нужно.