使用Polymer实现登录获用户数据遇阻,Postman正常但返回undefined
先帮你拆解下核心问题:后端抛出的SyntaxError: Unexpected token # in JSON at position 0,本质是body-parser无法正确解析请求体的JSON格式。结合Postman能正常工作但Polymer不行的情况,问题根源很明确——你用错了iron-ajax的参数属性。
问题出在哪?
你在iron-ajax里配置了params="[[params]]",但这个属性是用来把数据拼在URL的查询字符串里的(比如http://localhost:8080/login?username=xxx&password=xxx),而不是放在POST请求的请求体中。你的Node.js后端是通过req.body来获取JSON格式的请求数据,这就导致后端收到的请求体是空的(或者格式完全不符合JSON要求),body-parser解析失败,自然抛出语法错误,Polymer那边也就拿不到正确响应,返回undefined或者空数组。
具体修复步骤
只需要把iron-ajax的params属性改成body,让请求数据放在POST的请求体里,和你在Postman里的操作逻辑对齐即可:
修改后的Polymer iron-ajax代码
<iron-ajax id="ajaxUser" url="http://localhost:8080/login" method="post" handle-as="json" content-type="application/json" headers='{"Access-Control-Allow-Origin": "*"}' body="[[params]]" <!-- 替换原来的params属性 --> on-response="saveUserCredentials" last-response="{{user}}"></iron-ajax>
登录方法可以保持(或简化)
loginUser() { this.params = {"username": this.$.username.value, "password": this.$.password.value}; console.log(this.params); // 确认数据正确 // 直接发送请求即可 this.$.ajaxUser.generateRequest(); }
额外确认项
确保你的Node.js后端已经正确配置body-parser解析JSON请求体(Postman能正常工作应该已经配置了,但还是检查下更稳妥):
const bodyParser = require('body-parser'); // 解析JSON格式的请求体 app.use(bodyParser.json()); // 如果需要处理表单编码请求,可添加(可选) app.use(bodyParser.urlencoded({ extended: true }));
修复后为什么正常?
修改后,iron-ajax会把params里的JSON对象作为请求体发送,和你在Postman中选择raw -> JSON格式发送请求的行为完全一致。后端的body-parser能正确解析这个请求体,req.body.username和req.body.password就能拿到正确的值,查询数据库后返回的JSON响应也能被Polymer正常接收,this.user就不会再是undefined或者空数组了。
内容的提问来源于stack exchange,提问作者KVNA

