我正在使用 MarkLogic Grove(React) 开发 UI 应用程序。
默认情况下,来自网络浏览器的 REST API 调用将直接转发到 MarkLogic。
例如:http://主机名/v1/resources/foo/
如果REST API是特定路径,我想在node.js中按原样进行处理,而不将调用转发给MarkLogic。 我应该在哪里以及如何实现它?(仅适用于经过身份验证的用户。)
例如:http://hostname/my-rest-api/bar
我想要一些建议,因为 Grove 的源代码太多而且令人困惑。
最佳答案
不幸的是,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/
文件夹,其中包含该开发分支的内容。您应该能够进行相当简单的目录比较,以应用看起来有值(value)的更新。
开发分支至少包含一个名为 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 端点的应用程序。上述路由提供对媒体文件的实际二进制文件的访问,而普通的 CRUD GET 调用返回包含元信息的实体信封。
关于marklogic - 如何在 Marklogic Grove 中处理 Node.js 中的 REST API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64747392/