如何处理Marklogic Grove中node.js中的REST API?

如何处理Marklogic Grove中node.js中的REST API?,marklogic,marklogic-dhf,Marklogic,Marklogic Dhf,我正在使用MarkLogic开发一个UI应用程序 默认情况下,来自web浏览器的REST API调用将直接转发到MarkLogic 例如:http://hostname/v1/resources/foo/ 如果REST API是一个特定路径,我希望在node.js中按原样进行处理,而不将调用转发给MarkLogic。 我应该在哪里以及如何实现它?仅对经过身份验证的用户可用 例如:http://hostname/my-rest-api/bar 我想要一些建议,因为Grove有太多的源代码,而且很混

我正在使用MarkLogic开发一个UI应用程序

默认情况下,来自web浏览器的REST API调用将直接转发到MarkLogic

例如:http://hostname/v1/resources/foo/

如果REST API是一个特定路径,我希望在node.js中按原样进行处理,而不将调用转发给MarkLogic。 我应该在哪里以及如何实现它?仅对经过身份验证的用户可用

例如:http://hostname/my-rest-api/bar


我想要一些建议,因为Grove有太多的源代码,而且很混乱。

不幸的是,Grove的文档还不完整。如果谈论封送前端调用到MarkLogic后端,那么您谈论的是Grove中间层:。该子项目中嵌入了一些文档,这可能是最好的起点

该子项目的顶层有一个指向有关的进一步文档的指针。它也不会提供很多帮助,但它会告诉你去哪里找。grove节点中间层基本上是一个服务器。我们将主逻辑和大部分静态逻辑隐藏在您可以找到的子模块中。重要的一部分,即称为中间件的实际业务逻辑,已放在名为routes/的文件夹中

在这里,您可以编写/添加任何您喜欢的ExpressJS逻辑,尽管我们试图以默认路由的形式提供一些常用功能。您可以在routes/api/index.js顶部附近找到routeFactory

主分支(包含grove节点的最新版本)是相当最新的,但克隆该存储库的开发分支,并用该开发分支的内容替换/更新项目中生成的中间层/文件夹的内容仍然很有用。您应该能够进行相当直接的目录比较,以应用看起来值得的更新

开发分支至少包含一个名为Grove DefaultRestrate的新添加,它允许将随机URI重写到MarkLogic中的任何新目标URI。最初用于REST扩展,但对于映射到数据服务、/v1/values、/v1/rows或/v1/sparql调用非常有用。这是一种比传统的白名单代理更好的方法,我们主要是为了快速解决问题和向后兼容性而维护白名单代理

这里是一个使用defaultRestRoute的示例,此代码附加在中间层/routes/api/index.js的末尾附近:


它用于具有一个名为Media的实体的CRUD端点的应用程序中。上述路由提供对媒体文件实际二进制文件的访问,而普通CRUD GET调用返回包含元信息的实体信封。

谢谢。我在下面写了一个附加问题。我在另一个帖子中写了一个附加问题。
// 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);
});