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