Polymer登录请求返回undefined,Express报body-parser JSON解析错误
解决方案:修复Polymer iron-ajax POST请求格式与后端JSON解析错误
你的问题核心是前端请求数据传递方式错误,搭配后端中间件配置的小问题,导致后端无法解析JSON,最终前端拿到undefined。下面一步步解决:
1. 核心问题:iron-ajax的params不是用来传递POST请求体的
你当前用params传递用户名和密码,但params的作用是拼接URL查询参数(比如?username=xxx&password=xxx),而POST请求的JSON数据应该放在请求体里。这就是后端抛出Unexpected token # in JSON错误的原因——后端期望接收JSON格式的请求体,但实际收到的是URL编码的参数,格式不匹配导致解析失败。
修改前端iron-ajax配置与登录方法:
把params="[[params]]"替换为body="[[requestBody]]",同时调整登录逻辑里的数据赋值:
<!-- 修正后的iron-ajax --> <iron-ajax id="ajaxUser" url="http://localhost:8080/login" method="post" handle-as="json" content-type="application/json" <!-- 移除前端的Access-Control-Allow-Origin请求头,这是后端响应头,前端无需设置 --> body="[[requestBody]]" on-response="saveUserCredentials" last-response="{{user}}"></iron-ajax>
loginUser() { // 构造请求体数据,而非URL参数 this.requestBody = {"username": this.$.username.value, "password": this.$.password.value}; console.log(this.requestBody); // 输出已填充的JSON let request = this.$.ajaxUser.generateRequest(); request.completes.then(req => { console.log(req.response); // 现在可正常获取响应数据 console.log(this.user); // 也能正确拿到last-response绑定的值 }).catch(err => { // 新增错误捕获,方便排查问题 console.error("请求失败:", err); }); } saveUserCredentials() { console.log("用户数据:", this.user); }
2. 修复后端中间件顺序与解析冲突
你的后端中间件顺序存在问题,同时使用express-form-data和bodyParser.json()可能导致解析冲突。如果登录接口只接受JSON格式,建议调整如下:
// 先处理预检OPTIONS请求 app.options('*', cors(corsOptions)) // 先启用CORS中间件,再处理请求解析 app.use((req, res, next) => { res.header("Access-Control-Allow-Origin", "*") res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT") res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, content-type, Accept, Authorization, x-api-key") next() }) // 仅保留JSON解析(登录接口用JSON格式) app.use(bodyParser.json()) // 若其他接口需要form-data,可针对特定路由单独配置express-form-data // app.use('/some-form-route', formData.parse(formBody)) app.use(apiLimit)
3. 确保后端返回合法JSON格式
后端登录接口必须返回标准JSON,比如:
// 后端登录接口示例 app.post('/login', (req, res) => { const { username, password } = req.body; // 这里写你的身份验证逻辑... res.json({ success: true, user: { id: 1, username: username } }); // 务必返回JSON格式 })
为什么Postman能正常工作?
因为你在Postman里是直接把JSON放在请求体中发送的,而前端之前错误地用params把数据挂在URL上,两者请求格式完全不同,所以Postman能成功,前端不行。
完成以上修改后重新测试,前端会正确发送JSON请求体,后端能正常解析,this.user和req.response都会拿到预期的用户数据。
内容的提问来源于stack exchange,提问作者KVNA
相关产品推荐
相关产品推荐

