以下代码(使用PouchDB Authentication插件)失败,因为它触发浏览器发送CORS预检请求,并且CouchDB不支持OPTIONS HTTP方法。

var db = new PouchDB("http://localhost:5984/mydb");
db.login('username', 'password');
// assume the database URL and login info are valid

这是错误(在Chrome中)。请注意,Edge中也会发生此问题,但Firefox中不会发生此问题:



以下是Chrome发送的用于请求的 header (在Firefox中,它们没有明显的不同):
POST /_session HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 25
Accept: application/json
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://localhost:8080/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8,es-419;q=0.6,es;q=0.4

我已经通过 add-cors-to-couchdb 节点脚本启用了CORS。我尝试过的事情:
  • 在我的local.ini中的OPTIONS下手动添加[cors]作为方法
  • { ajax: { content_type: "text/plain" } }作为第三个参数传递给login

  • 所以,我的问题是:
  • 如何防止预检请求被触发?查看MDN documentation,似乎没有必要。
  • 如果以前无法实现,如何设置我的CouchDB服务器以响应预检请求?
  • 最佳答案

    碰到同样的问题。 Chrome似乎最近开始在发送OPTIONS预检前变得更加积极一些。
    解决此问题的部分方法是在CORS header 中指定特定的来源,而不是“*”,
    所以

    curl -X PUT $HOST/_config/cors/origins -d '"localhost:8080"'
    

    或类似。

    我仍然遇到预检错误,但是现在PouchDB成功进行了身份验证,因此我可以忽略该错误。
    我认为解决方法是让CouchDB响应_session URL上的OPTIONS。

    编辑,更多信息在这里
    https://github.com/nolanlawson/pouchdb-authentication/issues/111

    关于javascript - PouchDB身份验证触发CORS预检请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38859904/

    10-10 15:02