Does Cloudant support rewrites as functions?
我有一个 Cloudant 数据库,我想为我的包含斜杠的文档制作漂亮的 URL。所以我定义了一个重写函数,如下所示:
1 2 3 4 5 6 | { "_id":"_design/myRewrites", "rewrites":"function (req2) {\ return {path: "../../../" + req2.path.slice(4).join("%2F")};\ }" } |
重写函数格式更好:
1 2 3 | function (req2) { return {path:"../../../" + req2.path.slice(4).join("%2F")}; } |
根据 CouchDB 文档,自 CouchDB 1.7 起,CouchDB 就支持这种重写(作为字符串化函数),但 Cloudant 的文档没有提及这种特殊功能(仅从数组重写)。
这反映在我尝试 https://myAccount.cloudant.com/myDb/_design/myRewrites/_rewrite/hello/world/ 时的体验中,我得到以下响应:
1 | {"error":"unknown_command","reason":"unknown ddoc command 'rewrites'"} |
但是,我在某处读到 Cloudant 和 CouchDB 自 2.0 以来的源代码匹配,因此我希望 Cloudant 支持所有 CouchDB 功能。怎么回事?
另请参阅以下关于此的推文,其中 IBM 要求我在 StackOverflow 上提出问题并建议我可能在一个过时的集群上:https://twitter.com/digitalheir/status/845910843934085120
我的数据位置显示"Porter, London"。如果我改变它会有帮助吗?
tl;dr:抱歉,没有。 Cloudant 不支持重写为函数 :(
我们尝试了您的示例并得到了相同的结果。深入挖掘,我现在可以确认 Cloudant 不支持通过字符串化函数重写 URL。该服务仅支持使用数组方法进行重写。
我不能肯定地说,但我怀疑团队忽略了这个功能。也就是说,Cloudant 不太可能很快支持重写为 JS 函数,因为当前的方法不能很好地扩展,因为如果频繁更新视图,它可能会使数据库陷入困境。这与 Cloudant 建议人们使用内置 reduce 函数(在 Erlang 中实现)而不是编写自己的自定义 JavaScript reduce 的原因类似。
重写为数组,但是,确实可以扩展。但如果您动态生成 URL,这种方法显然行不通。在这种情况下,我们建议将 URL 重写功能移至应用服务器。不幸的是,如果你正在构建一个 CouchApp :/
这很令人困惑,所以感谢您指出这一点。我将要求 Cloudant 团队在文档中注意这一差异。希望这至少有助于提供一些关闭。您期望它起作用并没有错。