Angular POST 到 Clojure Ring receivesResponse for preflight 具有无效的 HTTP 状态代码 404

Angular POST to Clojure Ring receivesResponse for preflight has invalid HTTP status code 404

我正在努力克服我的 Angular / Clojure 应用程序的 cors 问题,但我无法理解要使用什么语法来避免 [=31= 的 Access-Control-Allow-Origin 错误] 和 GET 请求

我已将这段代码添加到我的 clojure 控制器中,我的路由在该控制器中,它似乎解决了 GET 请求的问题:

(POST "/node/create" request
    (let [node_object (or (get-in request [:params :data])
                          (get-in request [:body :data])
                          "ROUTER_ERROR")]
      {:status 200
       :headers {"Content-Type" "application/json"}
       :body (recursiftion.model/createNode node_object)
      }
))

(defn allow-cross-origin  
  "middleware function to allow crosss origin"  
  [handler]  
  (fn [request]  
   (let [response (handler request)]  
    (assoc-in response [:headers "Access-Control-Allow-Origin"]  
         "*"))))

(def app
 (-> (handler/api app-routes)
      (middleware/wrap-json-body {:keywords? true})
      (middleware/wrap-json-response)
      (allow-cross-origin)))

还有这个Angular代码

this.post = function (object) { 

    console.log('BANG', object);

    return $http({
                method: "post",
                url: "https://mywebserveraddress.com/node/create",
                data: object
            }); 
    };

但我的 POST 请求仍然存在相关错误:

preflight has invalid HTTP status code 404

我正在寻找正确的语法添加到我的 clojure 应用程序中,以便我从我的 angular spa 发出跨域 ajax 请求,这些请求将在本地主机上用于开发和外部服务器来自我的生产环境。

非常感谢您的帮助。

CORS 要求非GET 请求使用OPTIONS 方法发送所谓的"preflight" 请求。您的代码 returns 404 因为它们不是 (OPTIONS "/node/create" ...).

的处理程序

一个更好的 - 但仍然很不完整 - CORS 中间件的形状如下:

(def ^:private cors-headers
  {"access-control-..." ...})

(defn wrap-cors
  [handler]
  (fn [request]
    (some-> (if (= (:request-method request) :options)
              {:status 200}
              (handler request))
            (update :headers merge cors-headers))))

但是有更多的复杂性(比如 * 在某些情况下不是 Access-Control-Allow-Origin 的有效值),所以我建议使用已经存在的库,例如ring-cors or ring.middleware.cors,照顾他们。