如何从不同的领域调用蒸气?

时间:2019-12-02 22:26:31

标签: cors vapor

我只有一条简单的路线。 BE和FE在不同的域中,如何从FE调用BE以获得响应? FE是React。

我尝试添加此处指定的设置:https://github.com/vapor/documentation/blob/master/3.0/docs/vapor/middleware.md,但没有任何运气。

没有HTTP状态错误代码的FE拒绝呼叫。浏览器中的缓存已清除。

enter image description here

我尝试将这些行添加到路由中,但没有运气:

public func routes(_ router: Router) throws {

    router.grouped(CORSMiddleware()).post([Page].self, at: "/releases") { (req, pages) -> Future<[Page]> in
       req.response().http.headers.add(name: "Access-Control-Expose-Headers", value:"Access-Control-Allow-Origin")
        req.response().http.headers.add(name: "Access-Control-Allow-Origin", value:"*")

Postman调用BE时,它将起作用,而不是从FE中起作用。断点甚至没有从FE中命中。

我在浏览器中看到一些错误,BE完全没有响应:

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

The docs说:

鉴于抛出的错误会立即返回给客户端,因此CORSMiddleware必须在ErrorMiddleware之前列出;否则,将返回不带CORS标头的HTTP错误响应,并且浏览器无法读取该错误响应。

因此,您必须在CORSMiddleware之前注册ErrorMiddleware ,像这样:

var middlewares = MiddlewareConfig()
let corsConfiguration = CORSMiddleware.Configuration(
    allowedOrigin: .all,
    allowedMethods: [.GET, .POST, .PUT, .OPTIONS, .DELETE, .PATCH],
    allowedHeaders: [.accept, .authorization, .contentType, .origin, .xRequestedWith, .userAgent, .accessControlAllowOrigin]
)
let corsMiddleware = CORSMiddleware(configuration: corsConfiguration)
middlewares.use(corsMiddleware)
middlewares.use(FileMiddleware.self)
middlewares.use(ErrorMiddleware.self)
services.register(middlewares)

还值得注意的是,您只应在服务器上的 中直接配置访问控制检查,例如在NGINX配置中。如果同时设置两者,则访问控制将失败。