我只有一条简单的路线。 BE和FE在不同的域中,如何从FE调用BE以获得响应? FE是React。
我尝试添加此处指定的设置:https://github.com/vapor/documentation/blob/master/3.0/docs/vapor/middleware.md,但没有任何运气。
没有HTTP状态错误代码的FE拒绝呼叫。浏览器中的缓存已清除。
我尝试将这些行添加到路由中,但没有运气:
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完全没有响应:
答案 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配置中。如果同时设置两者,则访问控制将失败。