使用Node-GYP完成ArangoDB的哪些部分

我正在搞清楚ArangoDB的结构,以确定它是否可以成为我的长期解决scheme。

我的一个重要问题是,node-gyp(或Node-Addon)生成哪些部分,以及查询生成器如何将JavaScript生成的AQL查询转换为原生快速?

我知道自己也可以更深入地了解代码,但是如果一些核心开发人员能够回答这个问题(或者解释他们如何向JavaScript和AQL公开function),我认为这样做会快得多。

我觉得很多人都有责任去分析ArangoDB。 (我们的工作不是相信营销短语和基准…我们必须了解它是如何工作的)。

我的主要目标是将ArangoDB视为JavaScript开发人员。

ArangoDB不是由节点或gyp组成的。 但是,ArangoDB使用Google的V8 JavaScript引擎来执行JavaScript代码,就像node.js一样。

这意味着您可以在ArangoDB内部运行用户定义的JavaScript代码,并由V8在运行时将其编译为本地代码。 一些ArangoDB自己的模块也是用JavaScript编写的。 几个第三方JavaScript模块,包括由node.js和npm使用或编写的几个模块,也与ArangoDB捆绑在一起。

关于与node.js和npm模块的兼容性:

来自node.js和npm的模块也可以在ArangoDB中工作,只要它们不依赖于node.js内部或来自其他模块的代码。 这意味着只有JavaScript的所有模块,不需要任何节点特定的东西,应该在ArangoDB工作。 joi就是一个很好的例子。 依赖node.js特定对象的node.js / npm模块或node.js的C ++扩展在ArangoDB中不起作用。

ArangoDB本身是用C ++编写的,其中一些模块是用JavaScript编写的。 通过V8包装器对象和函数,用户定义的JavaScript代码和捆绑的ArangoDB JavaScript模块可以访问ArangoDB的内部结构。 这些函数是C ++函数,通过告诉V8它们存在而暴露给JavaScript。

下面是一个例子:ArangoDB公开了一个名为db的JavaScript对象。 这个对象有一些预定义的函数,例如_collection(<name>) 。 当这个函数被调用时,这实际上是对C ++函数的调用,然后C ++函数可以处理它的(JavaScript)参数,在这种情况下,它应该是一个集合名称string。 在C ++函数内部,将会查找指定名称的集合。 如果找不到,该函数将返回一个JavaScript null对象。 如果find,该函数将返回一个集合对象,包装在一个所谓的V8外部 。 对于JavaScript代码,这看起来像一个普通的对象,但是这个对象又有一些C ++的绑定。

为了使所有这些工作,服务器将在开始时在V8上下文中注册db对象,并为所有对象的方法注册包装函数。 它将为其他对象和函数这样做,所以有一个完整的JavaScript API用于服务器内部。

AQL ,ArangoDB的查询语言,是用C ++编写的,将会像这样执行。 有些AQL函数和操作符是用JavaScript实现的。 如果一个AQL查询使用这样的函数或运算符,那么将生成一个特定于查询的JavaScript代码片段,并使用V8进行编译并执行。 另外,AQL查询可以使用用户定义的JavaScript函数进行计算。 这些函数是常规的JavaScript函数,它们必须先在命令中注册才能用于查询。 这些函数的调用如上所述,生成并执行一段dynamic的JavaScript代码来调用用户定义的函数。

最后, ArangoDB的Foxx框架是用JavaScript编写的,允许在ArangoDB服务器中定义HTTP路由。 这些路由后面的操作是用户定义的,并且可以通过前面提到的方式访问服务器内部和数据库数据。