在 CouchDB/PouchDB-Server 中重写 URL

Posted

技术标签:

【中文标题】在 CouchDB/PouchDB-Server 中重写 URL【英文标题】:Rewrite URLs in CouchDB/PouchDB-Server 【发布时间】:2016-02-26 04:07:05 【问题描述】:

如果可能,我将如何使用PouchDB Server 实现以下 URL 重写?

/index.html,显示/index/_design/index/_show/index.html的HTML输出。

/my_database/index.html,显示/my_database/_design/my_database/_show/index.html

我的目标是使用 PouchDB(最终是 CouchDB)作为独立的 Web 服务器。

我正在努力将rewrite documentation 转换为工作代码。

【问题讨论】:

您是否要使用单个 _rewrite 端点来访问多个数据库(这就是这里的样子)?我不确定 PouchDB Server 如何处理它,但默认情况下 CouchDB 不允许这样做。否则,要记住的关键是所有“to”值都与包含rewrites 键的设计文档相关,所以"to": "_show/index.html" 我很高兴重写规则位于不同的数据库中。我真的只需要一个完整的重写文档示例,因为我没有运气实现文档中显示的部分 sn-ps。 你能解释一下你想要完成的事情吗?看起来您可能过度使用数据库部门和显示功能。很想知道更多,所以我可以提供更好的帮助! :) 我的目标是在没有其他服务器(如 nginx)的情况下从 CouchDB 为网站 (HTML) 提供服务,但仍然具有漂亮的 URL(没有 _design_show)。我想我可以使用数据库来定义路径并使用重写在每个路径中放置一个index.html。也许我对 CouchDB 期望过高? 没有。这是完全可行的!这就是为什么重写系统首先存在的原因。 ^_^ 我会在您可以“接受”的实际答案中添加更多内容(轻率地假设您会喜欢它……);) 【参考方案1】:

Apache CouchDB 使用 HTTP API 并且(因此)可以用作静态 Web 服务器——类似于 Nginx 或 Apache HTTPD,但额外的好处是您还可以使用 MapReduce 视图、复制和其他组成 Apache CouchDB 的部分。

仅使用核心 API,您就可以将整个静态网站作为附件存储在单个 JSON 文档中,并通过其自己的 URL 提供每个文件。如果该单个文档是_design 文档,那么您将获得重写器的附加值。

这是一个示例 faux JSON 文档,可以做到这一点:


  "_id": "_design/site",
  "_attachments": 
    "index.html": 
      "content_type": "text/html",
      "data": "..."
    ,
    "images/logo.png": 
      "content_type": "image/png",
      "data": "..."
  ,
  "rewrites": [
    
      "from": "/",
      "to": "index.html"
    
  ]

"data": "..." 的实际值将是文件的 base64 编码版本。请参阅CouchDB Docs 中的Creating Multiple Attachments 示例。

您还可以使用 CouchDB 的管理 UI,例如 Futon 或 Fauxton——可在 http://localhost:5984/_utils 获得——两者都提供文件上传功能。但是,这些系统将要求 JSON 文档首先存在,并将 PUT the attachment 直接放入数据库中。

完成后,您可以在 CouchDB(或 Cloudant)中设置一个 virtual host 条目,该条目指向该设计文档中的 _rewrite 端点。像这样:

[vhosts]
example.com = /example-com/_design/site/_rewrite/

如果您不在端口 80 上托管,则需要通过 http://example.com:5984/ 请求该站点。

仅当您想要将 JSON 转换为 HTML(或不同的 JSON、XML、CSV 等)时,才需要使用 _show 函数(如您的示例中所示)。如果您只想要静态托管,那么上面的选项非常有用。 ^_^

还有用于创建这些文档的出色工具。 couchapp.py 和couchdb-push 是我最常用的,都支持CouchApp filesystem mapping "spec"。

希望有帮助!

【讨论】:

太棒了,谢谢!我错过了vhosts 部分,所以它找不到重写。我还必须上传index.html 而不是提供_attachments 对象(我假设这就是你所说的假json)。也许值得根据这些要求更新答案? 我的错。您确实需要对 data 的值进行 base64 编码,即使它是简单的下一个:docs.couchdb.org/en/1.6.1/api/document/… 看来您使用 Futon 或 Fauxton 来上传——这很棒!——它可能直接 PUT 文件docs.couchdb.org/en/1.6.1/api/document/… @MattMS,我更新了答案以匹配。希望这能消除任何困惑!干杯。

以上是关于在 CouchDB/PouchDB-Server 中重写 URL的主要内容,如果未能解决你的问题,请参考以下文章

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据