如何为DHF 5部署的JavaScript自定义REST端点应用Amp以获取xdmp.eval执行权限?
如何为DHF部署的REST端点应用Amp以获取xdmp.eval权限
首先,你遇到的核心问题是:REST服务的POST动作默认运行在查询事务模式下,无法直接执行更新操作,而通过xdmp.eval启动新事务需要对应的权限,但直接给生成的三个文件加Amp没生效。其实正确的做法是为resource.sjs模块创建Amp,但要注意配置的细节,下面是具体步骤和要点:
为什么之前的尝试失败?
你尝试给resource.sjs、resource.xqy和metadata.xml都加Amp,但只有resource.sjs是实际处理POST请求的JS模块,另外两个是REST API自动生成的辅助文件,不需要配置Amp。之前失败大概率是Amp的配置参数没设对——比如模块路径不匹配、未关联正确的角色/用户。
正确创建Amp的步骤
1. 确认目标模块的完整路径
DHF部署后,你的端点模块在模块数据库中的路径是:/marklogic.rest.resource/my-endpoint/assets/resource.sjs
这个路径必须准确无误地写在Amp配置里。
2. 使用XQuery创建Amp
你可以通过Query Console执行以下XQuery代码来创建Amp,授予rest-api-user角色(或你的应用自定义角色)调用xdmp.eval的权限:
xdmp:amp-create( "my-endpoint-xdmp-eval-amp", -- Amp的自定义名称 "/marklogic.rest.resource/my-endpoint/assets/resource.sjs", -- 目标模块路径 "http://marklogic.com/xdmp/privileges/xdmp-eval", -- 需要的权限URI xdmp:role("rest-api-user") -- 要授予权限的角色,根据实际用户角色调整 )
3. 验证Amp是否生效
创建完成后,你可以通过以下XQuery查询已创建的Amp,确认配置正确:
xdmp:amp-get-all()
检查结果中是否包含你刚创建的Amp,模块路径、权限URI和角色是否完全匹配。
额外注意事项
- 角色选择:确保你授予Amp的角色是调用该REST端点的用户所拥有的角色(比如如果你的应用用自定义角色,就替换
rest-api-user为你的角色名)。 - xdmp.eval的参数:在你的
resource.sjs中调用xdmp.eval时,建议显式指定事务模式为update,避免默认模式的问题:
xdmp.eval(` // 你的更新逻辑代码 `, null, { transactionMode: "update", database: xdmp.database("your-content-db") // 按需指定目标内容数据库 });
- Amp的修改:如果需要调整Amp配置,可以先删除旧的再创建新的:
xdmp:amp-delete("my-endpoint-xdmp-eval-amp")
关于临时包装器的替代方案
其实不需要额外写包装器,只要正确配置Amp,直接在resource.sjs中调用xdmp.eval就能获取权限。包装器方案只是绕了个弯,不如直接给目标模块加Amp高效。
内容的提问来源于stack exchange,提问作者eaolson
相关产品推荐
相关产品推荐

