Node.js 中 cors 依赖详解
`cors` 是一个用于处理跨域资源共享(Cross - Origin Resource Sharing,CORS)问题的 Node.js 中间件,在前后端分离开发的项目中经常会用到。
一、跨域问题概述
在浏览器中,出于安全考虑,遵循同源策略,即浏览器只允许访问同源(协议、域名、端口都相同)的资源。当浏览器向不同源的服务器发起请求时,就会受到浏览器的跨域限制,导致请求被阻止。CORS 是一种现代的跨域解决方案,允许服务器在响应头中设置一些字段,告诉浏览器该请求是被允许的。
1. 安装 `cors`
# 使用 npm 安装
npm install cors
2. 基本使用
将 `cors` 中间件应用到整个 Express 应用,这意味着所有路由都允许跨域请求。当客户端(如浏览器)发起对 `/data` 路由的请求时,服务器会在响应头中添加必要的 CORS 相关字段,从而允许跨域访问。
const express = require("express");
const cors = require("cors");
const app = express();
// 使用 cors 中间件
app.use(cors());
app.get("/data", (req, res) => {
res.json({ message: "This is some data from the server" });
});
const port = 3000;
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
二、配置选项
`cors` 中间件提供了多种配置选项,以满足不同的跨域需求。
1. `origin`
用于指定允许跨域请求的源(origin)。可以是一个字符串、一个数组,或者是一个函数。
// 允许单个源
const corsOptions = {
origin: "http://example.com",
};
app.use(cors(corsOptions));
// 允许多个源
const corsOptionsMultiple = {
origin: ["http://example1.com", "http://example2.com"],
};
app.use(cors(corsOptionsMultiple));
// 使用函数动态配置 origin
const corsOptionsFunction = {
origin: (origin, callback) => {
const allowedOrigins = ["http://example.com", "http://test.com"];
if (!origin || allowedOrigins.includes(origin)) {
callback(null, true);
} else {
callback(new Error("Not allowed by CORS"));
}
},
};
app.use(cors(corsOptionsFunction));
2. `methods`
用于指定允许的 HTTP 请求方法,默认值为 `'GET,HEAD,PUT,PATCH,POST,DELETE'`。
const corsOptionsMethods = {
methods: "GET,POST",
};
app.use(cors(corsOptionsMethods));
3. `allowedHeaders`
用于指定允许的请求头,默认情况下,浏览器会自动处理一些常见的请求头。如果需要自定义请求头,可以使用该选项。
const corsOptionsHeaders = {
allowedHeaders: "Content-Type,Authorization",
};
app.use(cors(corsOptionsHeaders));
4. `exposedHeaders`
用于指定允许客户端访问的响应头。默认情况下,浏览器只能访问一些简单的响应头,通过该选项可以暴露更多的响应头给客户端。
const corsOptionsExposed = {
exposedHeaders: "X-Custom-Header",
};
app.use(cors(corsOptionsExposed));
5. `credentials`
一个布尔值,指示是否允许客户端在跨域请求中携带凭证(如 cookies、HTTP 认证等)。默认值为 `false`。
const corsOptionsCredentials = {
credentials: true,
};
app.use(cors(corsOptionsCredentials));
6. 针对特定路由使用 `cors`
除了将 `cors` 应用到整个应用,还可以针对特定的路由使用 `cors` 中间件。
const express = require("express");
const cors = require("cors");
const app = express();
const corsOptions = {
origin: "http://example.com",
};
// 只允许特定路由跨域
app.get("/data", cors(corsOptions), (req, res) => {
res.json({ message: "This is some data from the server" });
});
const port = 3000;
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});