Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 带有自定义JS的ArangoDB_Node.js_Arangodb - Fatal编程技术网

Node.js 带有自定义JS的ArangoDB

Node.js 带有自定义JS的ArangoDB,node.js,arangodb,Node.js,Arangodb,您好,有没有办法使用ArangoDB中内置的JS环境来执行自定义JS?我想设置要执行的JS文件的路径,而不是foxx应用程序文件。是的,这可以通过设置来完成。Foxx是作为一个更舒适的替代品创建的,对于非平凡的应用程序来说,它可能是一个更好的选择。文档可能很吓人,但Foxx服务实际上可以非常轻量级和简单(参见我的另一个答案)。如果您真的不想使用Foxx进行此操作,下面介绍如何手动执行此操作: 首先在\u modules系统集合中创建一个虚拟模块: var db = require('org/ar

您好,有没有办法使用ArangoDB中内置的JS环境来执行自定义JS?我想设置要执行的JS文件的路径,而不是foxx应用程序文件。

是的,这可以通过设置来完成。Foxx是作为一个更舒适的替代品创建的,对于非平凡的应用程序来说,它可能是一个更好的选择。文档可能很吓人,但Foxx服务实际上可以非常轻量级和简单(参见我的另一个答案)。如果您真的不想使用Foxx进行此操作,下面介绍如何手动执行此操作:

首先在
\u modules
系统集合中创建一个虚拟模块:

var db = require('org/arangodb').db;
db._modules.save({
  path: '/db:/ownTest',
  content: `
    exports.do = function (req, res, options, next) {
      res.body = 'test';
      res.responseCode = 200;
      res.contentType = 'text/plain';
    };
  `
});
require('internal').reloadRouting();
然后创建使用它的路由:

db._routing.save({
  url: '/ourtest', 
  action: {
    controller: 'db://ownTest'
  }
});
最后,告诉ArangoDB更新其路由缓存,以便它注意到新路由:

require('internal').reloadRouting();
如果您访问
js/common/
js/server/
目录,则可以使用模块名(例如
myOnDiskModule
),而不是
控制器中的虚拟模块名
“db://ownstest”

对于较小的模块,您可以使用
回调
而不是
控制器
内联定义函数:

db._routing.save({ 
  url: '/hello/echo',
  action: { 
    callback: `
      function (req, res) {
        res.statusCode = 200;
        res.body = require('js-yaml').safeDump({
          Hello: 'World',
          are: 'you here?'
        });
      }
    `
  } 
});
请记住在更改路由集合后始终更新路由缓存:

var db = require('org/arangodb').db;
db._modules.save({
  path: '/db:/ownTest',
  content: `
    exports.do = function (req, res, options, next) {
      res.body = 'test';
      res.responseCode = 200;
      res.contentType = 'text/plain';
    };
  `
});
require('internal').reloadRouting();
注意:2.8中的
回调
实现有一个bug,将在2.8.3中修复。如果您想手动应用修复程序,可以通过GitHub在。

模块缓存独立于路由是正确的 隐藏物清除模块缓存(或防止模块被删除) 缓存)当前不受支持

actions机制实际上只是作为一个内部API和 仅支持与早期ArangoDB的向后兼容性 版本和一些边缘案例

正如您在挖掘ArangoDB源代码时所注意到的那样 代码,Foxx提供了一个每个服务模块的缓存,该缓存被清除 每当重新加载Foxx服务时。我强烈鼓励你 在继续深入研究这个问题之前,先看看Foxx是否适合您的用例 作用机制

实际上,只需两个文件(一个 清单和控制器文件),并且不使用存储库或 模型(您可以使用操作中可用的相同API)

您只需要这样一个控制器文件(例如,
ctrl.js
):

使用
manifest.json
如下所示:

{
  "name": "my-foxx",
  "version": "0.0.0",
  "controllers": "ctrl.js",
  "defaultDocument": "",
  "engines": {"arangodb": "^2.8.0"}
}
然后,您可以在如下路径装载服务(上载zip包)
/db
并访问它:

curl http://localhost:8529/_db/_system/db
即将发布的3.0版本将删除许多现有的概念性功能 Foxx的开销,这将使它更容易获得 从它开始


我能够从磁盘运行自定义脚本,该磁盘将一个字符串记录到控制台,但当我更改脚本时,它什么也没做。它没有做新的东西,但也不再记录了。是否有缓存或需要刷新的内容?我试图运行require('internal')。重载路由();在JS Shell中,但它没有帮助。数据库进程重新启动后,将应用新代码。有没有办法避免重新启动数据库?这里为FOXX提供了开发模式。您必须自己使用
require(“internal”).load(“/some/test/.js”)
dothebart,该命令会导致
TypeError:require(…)。load不是一个函数
如何从该模块访问除_系统之外的数据库?您可以将
\u db/[databasename]/…
放在URL中或运行
require(“internal”)在需要之前使用数据库()。但是,推荐的方法是使用FOXX。