MEAN栈(Angular 1)跨域+HTTP 400错误排查求助
先帮你梳理下核心问题:你遇到的CORS报错大概率是浏览器请求失败后的附带提示,真正的根源是请求格式不匹配导致的400 Bad Request。结合你的代码,我整理了几个关键问题点和修正方案:
1. 请求体格式错误(400错误的主要原因)
你在Angular的buscarCep方法里直接把字符串cep作为POST请求的body传递:
$http.post(`http://localhost:3003/api/buscarCep`, cep)
但后端的接收逻辑是从req.body.cep取值,这意味着后端期望的是一个包含cep字段的JSON对象,而不是纯字符串。直接传字符串会导致req.body无法被正确解析,req.body.cep为undefined,触发400错误。
修正方案:
把请求体改成对象格式,同时建议使用你定义的consts里的API地址(避免硬写地址):
function buscarCep(cep) { return $http.post(`${consts.apiUrl}/buscarCep`, { cep: cep }) .then(resp => { console.log(resp) return resp.data }).catch(function (resp) { console.log("erro:", resp) }) }
2. 未携带认证令牌(可能的隐藏问题)
你的buscarCep路由属于protectedApi组,这个组启用了auth中间件(JWT验证)。你提到其他路由(比如alertas)能正常工作,说明那些请求都携带了有效的Authorization头,但buscarCep的请求里没有配置这个头,可能导致认证失败(如果auth中间件返回400而非标准的401)。
修正方案:
确保请求携带Authorization头,推荐用Angular的HTTP拦截器统一处理(避免每个请求重复写):
// 新建认证拦截器工厂 angular.module('primeiraApp').factory('authInterceptor', ['consts', '$window', function(consts, $window) { return { request: function(config) { const token = $window.localStorage.getItem(consts.tokenKey) if (token) { config.headers.Authorization = 'Bearer ' + token } return config } } }]) // 注册拦截器到HTTP服务 angular.module('primeiraApp').config(['$httpProvider', function($httpProvider) { $httpProvider.interceptors.push('authInterceptor') }])
3. 后端接收逻辑未做错误处理
你的后端buscarCep函数只取了req.body.cep,但没有参数校验和后续业务逻辑,即使拿到CEP也没有调用第三方接口的代码,会导致请求挂起或返回空响应,进一步触发前端错误。
修正方案:
完善后端逻辑,添加参数校验和第三方CEP接口调用(以ViaCEP为例):
const fetch = require('node-fetch') const buscarCep = (req, res, next) => { const cep = req.body.cep; // 校验CEP格式是否为8位数字 if (!cep || !/^\d{8}$/.test(cep)) { return res.status(400).json({ error: 'CEP格式无效,需为8位数字' }); } // 调用第三方CEP查询接口 fetch(`https://viacep.com.br/ws/${cep}/json/`) .then(resp => { if (!resp.ok) throw new Error('CEP查询失败'); return resp.json(); }) .then(data => { if (data.erro) { return res.status(404).json({ error: '该CEP不存在' }); } res.json(data); }) .catch(err => { console.error('查询CEP出错:', err); res.status(500).json({ error: '服务器内部错误' }); }); } module.exports = { buscarCep }
关于CORS报错的说明
你已经配置了全局CORS中间件,其他路由正常说明CORS配置本身没问题。浏览器显示的CORS报错是400错误导致的附带提示——当请求返回错误状态码时,浏览器会额外检查CORS头,即使头已经存在,也可能会把这个问题一起显示出来。解决上述400的问题后,CORS报错应该会自动消失。
内容的提问来源于stack exchange,提问作者Fred

