解决 CouchDB CORS OPTIONS 预检 405 Method Not Allowed 错误

每一次用CouchDB我都会后悔, 然后找个理由放弃它转用MongoDB. 这一次我不想这样了, 然后就因此多浪费了好几个小时, 所以这大概是我最后一次在项目里用CouchDB.

CouchDB的CORS支持在1.3版本中作为实验性功能添加之后, 似乎就没有什么更新了, 用到这个功能的开发者好像也不多. 由于这次我是把CouchDB作为无后端开发的BaaS来用, 只想依赖CouchDB原有的功能, 所以不得不把这个自带的CORS支持给利用起来.

CouchDB的文档虽然已经差不多被官方改写成了教程书籍, 但作为一个教程, 它的章节设计实在是太烂了, 以至于同一个功能你可以在好几个地方找到, 而且还都不全, 差不多每一处都是只把话讲一半, 从来就不懂得把整个内容讲解给读者, 有时候你会觉得这还不如干脆就写成API文档算了. 几个版本下来, CORS的配置方法在教程里的位置也几经辗转, 现在跑进了3.4. CouchDB HTTP Server — Apache CouchDB 2.0.0 Documentation, 就这我还是通过Google才找到的, 我也是不明白为什么之前版本独立一章的内容现在要并入别的章节了, 还有像是目前Stable版本是1.6.1可为什么页面标题是CouchDB 2.0啊突然就同时出现普通双引号和英式双引号啊这类很神秘的问题, 我现在都可以选择性忽略了, 再说下去恐怕就要出脏字了.

于是我参考着文档, StackOverflow, 以及pouchdb/add-cors-to-couchdb, 配置好了ini文件(实际上这是我最后的ini文件):

[httpd]
enable_cors = true

[cors]
credentials = true  
origins = *  
headers = accept, authorization, content-type, origin, referer, x-csrf-token  
methods = GET, PUT, POST, HEAD, DELETE  

然后:

fetch "#{DB_SERVER}/_users/org.couchdb.user:#{name}",  
  credentials: 'include'
  method: 'PUT'
  body: JSON.stringify { name, password, roles: [], type: 'user', '_id': "org.couchdb.user:#{name}" }
.then check-status
.then resolve
.catch reject

结果:

Response for preflight has invalid HTTP status code 405

我尝试了多种配置, 包括检查配置文件的大小写, 甚至看了一会CouchDB那我并没有掌握的Erlang语言的源代码, 还是不清楚为毛会有这个错误...直到我发现了[COUCHDB-2027] CORS should not require authentication on preflight OPTIONS request - ASF JIRA以及[COUCHDB-2763] CORS Authentication issues - ASF JIRA.

这两篇issues里提到: preflight OPTIONS 405 Method Not Allowed的错误在Header里加上Authentication可解, 这个问题已经持续了好几个版本.

excuse me???

我试了一下, 还真给解决了.

妈的智障.

"Relax, motherfucker."

看到CouchDB的Logo里躺在沙发上姿势拽得要死的小人我就烦躁.