Node.js Express服务中CORS配置cors(options)工作原理疑问
app.use(cors(options)) 运行逻辑相关疑问 以下是React应用后端的server.js代码,核心疑问为代码中app.use(cors(options));的运行逻辑。
完整服务端代码
const express = require("express"); const app = express(); const cors = require("cors"); let allowed = ["http://localhost:3000", "http://localhost:4000"]; function options(req, res) { let tmp; let origin = req.header("Origin"); if (allowed.indexOf(origin) > -1) { tmp = { origin: true, optionSuccessStatus: 200, }; } else { tmp = { origin: false, }; } res(null, tmp); } app.use(cors(options)); app.listen(8000, () => { console.log("Server running at 8000"); }); app.get("/", (req, res) => { res.send("Hi From server hello super"); });
待解答问题
options是定义好的接收参数的函数,在app.use(cors(options))这行代码中,函数的参数是如何被传入的?- 代码中的
res(null,tmp)作用是什么,它是否等价于res.send(tmp)?
问题解答
- 关于参数传入逻辑:你定义的
options是交给cors包内部调用的配置回调,不需要手动传参。cors注册为Express中间件后,每次收到请求会自动触发逻辑:它会先拿到当前请求的req对象,再生成一个用于接收配置的内部回调函数,把这两个值作为参数传入你写的options函数执行。app.use(cors(options))这行只是把options函数的引用传给cors包,真正执行函数、传递参数的动作完全是cors包内部完成的。 - 关于
res(null, tmp)的作用:这里形参名写的res和Express路由里的响应对象完全无关,和res.send(tmp)没有任何等价关系。
它是cors内部定义的错误优先风格的配置接收器:调用res(null, tmp)的作用是把你生成的跨域规则tmp交还给cors包,第一个参数传null代表配置生成过程没有出现错误,第二个参数就是cors后续要使用的具体跨域配置。cors拿到这个配置后,才会自动给响应添加对应的CORS响应头,决定是放行还是拦截当前跨域请求。
如果在这里误写res.send(tmp),相当于把cors传入的回调错当成Express响应对象,不仅跨域校验逻辑完全失效,还会直接把配置对象作为响应内容返回给前端,导致接口异常。
内容的提问来源于stack exchange,提问作者sabari
相关产品推荐
相关产品推荐

