在 Web 开发中,CORS 跨域问题是一个很常见的问题。在使用 Express.js 开发时,我们也经常遇到这个问题。
什么是 CORS 跨域问题
跨域问题指的是在浏览器端,当我们发起一个 HTTP 请求的时候,在响应中会得到一个错误信息,提示我们无法访问该资源。
通常情况下,一个网站只能访问自己的资源,即只能访问同一域名下的资源。例如,一个页面在 www.example.com
下,它只能访问属于 www.example.com
下的资源。如果该页面试图访问其他域名下的资源,就会受到浏览器的限制,从而导致跨域问题。
CORS(Cross-Origin Resource Sharing)是一种允许跨域访问资源的机制。当我们使用 XMLHttpRequest 对象或者 fetch API 发起跨域请求时,服务端需要在响应头中添加一些指定的字段,告诉浏览器允许跨域访问。如果服务端没有设置这些字段,浏览器就会认为该请求是不安全的,从而阻止请求。这就是常说的 CORS 跨域问题。
在 Express.js 中如何解决 CORS 跨域问题
在 Express.js 中,我们可以使用 cors
中间件来解决 CORS 跨域问题。
cors
是一个被广泛使用的 Express.js 中间件,它允许我们在响应头中添加 CORS 相关的字段,从而允许跨域访问。
安装 cors
中间件:
npm install cors --save
在我们的 Express.js 应用中,引入和使用 cors
中间件:
const express = require('express'); const cors = require('cors'); const app = express(); app.use(cors());
我们使用 app.use()
方法来使用 cors
中间件。
设置 CORS 跨域规则
默认情况下,cors
中间件允许所有来源(或者说所有域名)访问这个资源,允许所有的 HTTP 方法,允许浏览器发送来携带 cookie 的请求。如果我们希望更精细地配置 CORS,我们可以传递一些参数来设置规则。
const corsOptions = { origin: 'http://example.com', methods: 'GET,PUT,POST,DELETE', credentials: true, }; app.use(cors(corsOptions));
在上面的代码中,我们通过 corsOptions
对象来设置 CORS 跨域规则。具体含义如下:
origin
:允许访问的来源地址。可以是一个字符串,表示一个固定的来源地址,也可以是一个数组,表示多个来源地址。此外还可以是一个函数,来自定义判断来源是否允许访问。methods
:设置允许的 HTTP 方法。credentials
:设置是否允许浏览器发送携带 cookie 的请求。
在 Express.js 中使用代理解决 CORS 跨域问题
有时候,我们无法控制后端服务的响应头,或者我们不想在生产环境下开放 CORS,但是在开发过程中需要访问某些跨域资源。这时,我们可以使用代理来解决 CORS 跨域问题。
在 Express.js 中,可以使用 http-proxy-middleware
和 express-http-proxy
两个包来实现代理。
这里我们以 http-proxy-middleware
为例来介绍。
安装 http-proxy-middleware
:
npm install http-proxy-middleware --save-dev
使用 http-proxy-middleware
:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - --------------------- - - --------------------------------- ----- --- - ---------- --------------- ----------------------- ------- ----------------------------- ------------- ----- ------------ - -------- -- -- ----
在上面的代码中:
target
:指向我们要代理的目标地址。changeOrigin
:设置为 true 表示我们要将请求头中的origin
字段设置为目标地址,从而避免浏览器的 CORS 限制。pathRewrite
:例如我们要代理http://backend.example.com/api/posts
,我们在路由中使用/api
,所以实际请求的地址为/api/posts
,需要将其转换为目标地址/posts
。
总结
在开发中,我们常常需要与其他域名下的资源进行通信,而 CORS 跨域问题就是一个很常见的问题。在 Express.js 中使用 cors
中间件可以很方便地解决这个问题。如果我们无法控制服务端响应头,或者不希望在生产环境下开放 CORS,可以使用代理来解决。
以上就是本文的全部内容,希望能对大家有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6454bf7e968c7c53b088669a