Vue调用Node.js接口遇CORS预检请求失败(IIS部署后)求助
解决Vue调用Node.js接口的CORS预检错误(部署到IIS后出现)
问题诊断
错误核心:预检请求(OPTIONS)未返回HTTP 200状态,开发环境正常但IIS部署后异常,根源是Node服务CORS配置冲突+IIS未正确转发OPTIONS请求。
现有代码问题
你同时使用了自定义CORS头中间件和cors包,规则重复冲突导致预检响应头混乱;且IIS默认可能拦截OPTIONS请求,不转发到Node应用。
修复步骤
1. 简化Node.js的CORS配置,移除重复逻辑
删除自定义CORS头设置,仅保留cors包统一配置,避免规则冲突:
const cors = require('cors'); const router = express.Router() // 统一CORS配置,覆盖所有路由 const corsOptions = { origin: "http://0.0.0.0:1050", // 生产环境替换为实际前端域名 methods: "GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS", preflightContinue: false, optionsSuccessStatus: 200 }; // 全局应用CORS,无需给单个路由重复添加 router.use(cors(corsOptions)); router.post('/sendsecondarysalesreport', (req, res, next) => { try { if (req.body.CustomerCode) { // 更严谨的空值判断 SendSecondarySalesReport(req.body); res.json([{ "CustomerCode": req.body.CustomerCode }]); } else { res.status(404).send({ "Status": false, "Error": "Not Found" }); // 匹配404状态码 } } catch (error) { console.log("error", error); res.status(500).send(error.message); // 链式调用简化代码 } }); module.exports = router ;
2. 配置IIS,确保OPTIONS请求正确转发
修改IIS站点的web.config(无则新建),避免IIS拦截OPTIONS请求:
<configuration> <system.webServer> <handlers> <add name="iisnode" path="server.js" verb="*" modules="iisnode" /> </handlers> <rewrite> <rules> <rule name="NodeJS" patternSyntax="ECMAScript"> <match url="/*" /> <action type="Rewrite" url="server.js" /> </rule> </rules> </rewrite> <!-- 配置跨域头,确保OPTIONS请求正常响应 --> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="http://0.0.0.0:1050" /> <add name="Access-Control-Allow-Methods" value="GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS" /> <add name="Access-Control-Allow-Headers" value="Content-Type" /> </customHeaders> </httpProtocol> <iisnode nodeProcessCommandLine=""C:\Program Files\nodejs\node.exe"" /> </system.webServer> </configuration>
注意:若Node入口文件不是
server.js,需对应修改path值;生产环境请将Access-Control-Allow-Origin替换为实际前端域名,不要用*(需携带Cookie时必须指定域名)。
3. 验证修复效果
部署后,用浏览器开发者工具「网络」面板查看OPTIONS请求:
- 确认响应状态码为200
- 检查响应头包含正确的
Access-Control-*字段
额外优化
- 前端代码中,
response.status是数字类型,将判断逻辑改为if (response.status === 200) - 生产环境建议通过反向代理让前后端同域名部署,从根源避免CORS问题,提升安全性
内容的提问来源于stack exchange,提问作者ManojMokavoor
相关产品推荐
相关产品推荐

