我们正在从 MarkLogic 6 升级到 8,并且在调用库模块时遇到了一些问题。我们有 xquery 库模块,可以从自定义 REST 扩展和非 REST xquery 调用。
马克逻辑公司文档表示 REST 端点可以使用通过新 /ext 端点安装的库或以旧方式安装的库(放置在模块数据库中的其他位置)。但是,当库模块使用 MarkLogic 附带的 functx 包时,我无法使交叉工作。
假设我有两个相同的库模块,其中一个通过安装/ext
还有一个不是:
xquery version "1.0-ml";
module namespace test = "test/lib";
import module namespace functx = "http://www.functx.com" at "/MarkLogic/functx/functx-1.0-nodoc-2007-01.xqy";
declare function test:stuff() {
<foo/>
};
第一个是使用此命令安装的,以防万一:
curl --anyauth --user user:pwd -X PUT -i -d @".\\module\\testlib-ext.xqy" -H "Content-type: application/xquery" "http://host:8020/v1/ext/test/testlib-ext.xqy?perm:rest-reader=execute"
我有使用每个模块的其余端点(唯一的区别是命名空间和导入):
xquery version "1.0-ml";
module namespace te = "http://marklogic.com/rest-api/resource/test-ext-to-ext";
import module namespace test = "test/lib" at "/ext/test/testlib-ext.xqy";
declare function te:get($context as map:map, $params as map:map) as document-node()* {
document { test:stuff() }
};
使用安装的库的一个/ext
作品。使用简单放置在模块数据库中的模块的安装不会出现错误,但在非管理员用户调用时会出现错误(它在由管理员调用时有效):
RESTAPI-INVALIDREQ: (err:FOER0000) Invalid request: reason: Extension test-ext-to-lib does not exist.
我只是使用它们全部安装/ext
,但是 xquery 使用xdmp:invoke
休息。这是一个不同的错误,但似乎是相同的根本问题。使用放置在模块数据库中的库调用模块是有效的。使用通过安装的库调用模块/ext
失败并出现此错误:
XDMP-MODNOTFOUND: (err:XQST0059) xdmp:invoke("/test/test-module-to-ext.xqy", (), ()) -- Module C:\Program Files\MarkLogic\Modules\MarkLogic\functx\functx-1.0-nodoc-2007-01.xqy not found
如果我添加admin
角色到调用用户,所有这些都有效。如果我取出 functx 导入,即使没有管理员角色,它们也可以工作。
它看起来像是权限问题,但我找不到可以修复它的角色或权限。除了管理员本身被选中之外,用户对每个复选框都具有角色。检查最后一个复选框是我发现的唯一使这项工作有效的方法,这显然不是一个可行的解决方案。
我们并不真正关心库是如何安装的,但我们不想重复代码。我们如何才能使这些导入同时适用于 REST 和非 REST xquery?