MST
星途 面试题库

面试题:Node.js跨域场景下的预检请求处理

在Node.js处理HTTP服务跨域时,预检请求(OPTIONS请求)是一个重要概念。请详细阐述预检请求产生的场景、作用,并且说明在Node.js(同样使用Express框架)中如何正确处理预检请求,保证跨域操作的顺利进行。
46.7万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

预检请求产生的场景

当浏览器发起跨域请求,且该请求不是简单请求(满足以下条件的为简单请求:1. 使用GET、POST或HEAD方法;2. Content-Type 为 application/x-www-form-urlencoded、multipart/form-data 或 text/plain;3. 没有自定义头部字段)时,浏览器会先发送一个 OPTIONS 请求,即预检请求。

预检请求的作用

  1. 安全验证:服务器通过预检请求,检查实际请求是否安全,比如是否允许跨域,允许哪些请求方法、头部字段等。避免潜在的安全风险,如恶意请求。
  2. 协商权限:浏览器和服务器在实际请求发送前,通过预检请求协商跨域请求的权限,确保实际请求能够被服务器正确处理。

在Node.js(使用Express框架)中处理预检请求

const express = require('express');
const app = express();

// 处理预检请求
app.options('*', (req, res) => {
    // 设置允许跨域的响应头
    res.set('Access-Control-Allow-Origin', '*');
    res.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
    res.set('Access-Control-Allow-Headers', 'Content-Type, Authorization');
    res.status(200).send();
});

// 处理实际的跨域请求
app.use((req, res, next) => {
    res.set('Access-Control-Allow-Origin', '*');
    next();
});

// 其他路由和中间件
app.get('/', (req, res) => {
    res.send('Hello World!');
});

const port = 3000;
app.listen(port, () => {
    console.log(`Server running on port ${port}`);
});

在上述代码中:

  1. 处理预检请求app.options('*', ...) 表示对所有路径的 OPTIONS 请求进行处理。在处理函数中,设置了允许跨域的响应头,包括允许的源(Access-Control-Allow-Origin)、请求方法(Access-Control-Allow-Methods)和头部字段(Access-Control-Allow-Headers),然后返回状态码200。
  2. 处理实际跨域请求:通过 app.use((req, res, next) => {...}) 中间件设置允许跨域的源,确保实际请求能够顺利通过跨域检查。