首页 > 解决方案 > 如何从不同的域调用 Vapor?

问题描述

我只有一个简单的路线。BE和FE在不同的域,如何从FE调用BE得到响应?FE 是反应。

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

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

在此处输入图像描述

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

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:"*")

当从 BE 调用 BE 时Postman,它会起作用,而不是从 FE 调用。断点甚至没有被 FE 击中。

我在浏览器中看到一些错误,而 BE 根本没有响应:

在此处输入图像描述

在此处输入图像描述

标签: corsvapor

解决方案


文档说:

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

因此,您必须在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 配置中。如果两者都设置,访问控制将失败。


推荐阅读