不幸的是,Grove 的文档还没有完全到位。如果谈论将前端调用编组到 MarkLogic 后端,那么您就是在谈论 Grove 中间层:grove-node。该子项目中嵌入了一些文档,这可能是最好的起点。
该子项目的顶级README 具有指向有关Endpoints and Routes 的更多文档的指针。它也没有提供很多帮助,但它确实告诉你在哪里寻找。 grove-node 中间层基本上是一个ExpressJS 服务器。我们将主要的、大部分是静态的逻辑隐藏在一个子模块中,您可以找到 here。重要的部分,实际的业务逻辑(称为中间件)已放在名为 routes/ 的文件夹中。
您可以在其中编写/添加您喜欢的任何 ExpressJS 逻辑,尽管我们尝试以默认路由的形式提供许多常用功能。您可以在routes/api/index.js 顶部附近找到routeFactory。
包含最新版本 grove-node 的 master 分支是最新的,但克隆该存储库的开发分支并替换/更新生成的 middle-tier/ 文件夹的内容仍然很有用在您的项目中使用该开发分支的内容。您应该能够进行相当直接的目录比较,以应用看起来值得的更新。
开发分支至少包含一个名为 Grove defaultRestRoute 的新增功能,它允许将随机 URI 重写为 MarkLogic 中的任何新目标 URI。最初用于 REST 扩展,但对于映射到数据服务、/v1/values、/v1/rows 或 /v1/sparql 调用非常有用。这是一种比传统白名单代理更好的方法,我们主要维护它是为了快速解决问题和向后兼容。
这里是一个使用defaultRestRoute的例子,这段代码被附加在middle-tier/routes/api/index.js的末尾附近:
// Special case for Raw Media
router.use('/crud/Media/:mediaId/:binaryType', function(req, res, next) {
let mediaId = decodeURIComponent(req.params.mediaId);
let binaryType = decodeURIComponent(req.params.binaryType);
return routeFactory.defaultRestRoute({
authProvider: authProvider,
authed: true, // default: true
neverCache: true, // default: true
action: {
uri: '/v1/documents',
GET: function() {
return {
method: 'GET',
body: null,
params: {
uri: '/Media/' + mediaId + '/binary.' + binaryType
}
};
}
}
})(req, res, next);
});
它用于具有 CRUD 端点的应用程序,该端点用于名为 Media 的实体。上述路由提供了对媒体文件实际二进制文件的访问,而普通的 CRUD GET 调用返回包含元信息的实体信封。