开发者问题收集

Node.js C++ 插件尝试使用“require”函数执行 JavaScript 代码

2018-12-14
423

我在c ++中维护一个node.js add-on。但是不幸的是(对我来说)解析器已使用一些node.js库在JavaScript中实现(函数 requiend requiend 正在使用);这是我需要执行的JavaScript代码的一个示例:

966557472

我尝试编写类似的内容:

354860861

,但不幸的是这不起作用。 网络结果是错误消息 “ ReferenceError:requient ins Indin” :显然,我的上下文对node.js。

我尝试包装上述js函数中的表达式 parsesqlText ,但是脚本执行程序同样未知(我获取错误消息 “ referenterror:parsesqltext intecter oferate )。

我的问题是:有什么办法可以解决这个问题吗?

任何帮助将不胜感激。我很高兴避免在C ++中重新实现该解析器...目前这似乎是唯一可行的方法。

2个回答
  • 首先,v8 不是 Node.js,Node.js 是建立在 v8 之上的。
  • v8 是一个 javascript 引擎
  • 因此 Node.js 库本身并不随 v8 一起提供

         N-API 就是问题的答案。尽管它通常用于为 Node.js 编写本机 C++ 插件。 github 线程 belwo 有一些示例。此外,N-API 的 node.js 文档也已链接。
         Github Thread
         Node N-API Docs

编辑:似乎这项工作已经完成了,在此 存储库 中。作者这样做是为了抽象 v8 的所有准备工作,并为您只写一行。

#include "node_embed.h"

int main(int argc, char** argv) {
    node_context *context = nodeSetup(argc, argv);

    if (context) {
        nodeExecuteString(context, "let foo = 1", "__init__");
        nodeExecuteString(context, "foo = 2", "__init__");
        nodeExecuteString(context, "console.log(foo)", "__init__");

        return nodeTeardown(context);
    } else {
       return 12;
    }
}

以上内容来自存储库,可让您运行该代码片段。

Chance Shaffer
2018-12-17

我建议您去找一个已经用 C++ 编写的 SQL 解析器。我在 github.com 上搜索了十秒钟就 立即 找到了一个。

在我看来,将 JavaScript 语言引入此场景没有任何技术理由,只是为了能够“解析 SQL”。您根本不需要“从头开始编写”任何东西。它只是一个对象 - 将其“现成地”取出,实例化它的一个实例,然后使用它。

Mike Robinson
2018-12-14