我正在使用MarkLogic Grove(React)开发一个UI应用程序。
默认情况下,来自web浏览器的REST API调用将直接转发到MarkLogic。
例如:http://hostname/v1/resources/foo/
如果REST API是一个特定的路径,我希望在不将调用转发到MarkLogic的情况下在node.js中进行处理。我应该在哪里以及如何实现它?(仅对经过身份验证的用户可用。)
例如:http://hostname/my-rest-api/bar
我想要一些建议,因为Grove的源代码太多了,而且令人困惑。
发布于 2020-11-09 17:38:25
不幸的是,Grove的文档还不完全在那里。如果谈到编组对Grove后端的前端调用,那么您谈论的是MarkLogic中间层:grove-node。该子项目中嵌入了一些文档,这可能是最好的起点。
该子项目的顶级README有一个指向有关Endpoints and Routes的更多文档的指针。它也不会提供很多帮助,但它会告诉你去哪里找。grove-node中间层基本上是一个ExpressJS服务器。我们把主要的、大部分是静态的逻辑放在一个可以找到here的子模块中。重要的是,实际的业务逻辑(称为中间件)放在名为routes/的文件夹中。
您可以在其中编写/添加任何您喜欢的ExpressJS逻辑,尽管我们试图以默认路由的形式提供一些常用的功能。您可以在routes/api/index.js顶部附近找到routeFactory。
主分支(包含grove-node的最新版本)是相当新的,但克隆该存储库的开发分支,并用该开发分支中的内容替换/更新项目中生成的middle-tier/文件夹的内容仍然很有用。您应该能够进行相当直接的目录比较,以应用看起来有价值的更新。
开发分支至少包含一个称为Grove的新添加,它允许将随机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);
});它用在一个应用程序中,该应用程序具有一个名为Media的实体的CRUD端点。上面的路由提供了对媒体文件的实际二进制文件的访问,而普通的CRUD GET调用返回包含元信息的实体信封。
https://stackoverflow.com/questions/64747392
复制相似问题