如何解决MERN栈开发中UnhandledPromiseRejection报错问题?
报错原因
你遇到的SyntaxError: Unexpected token o in JSON at position 1错误,核心诱因是后端代码中对已经完成解析的请求体做了重复的JSON解析操作:
- 前端发送的请求头携带了
Content-Type: application/json,只要你的Express服务注册了express.json()中间件,就会自动将传入的JSON格式请求体解析为JavaScript对象,此时req.body已经是可直接使用的对象类型 - 你在接口代码第一行执行了
JSON.parse(req.body),JSON.parse方法要求接收字符串类型参数,当传入对象时会先隐式将对象转为字符串"[object Object]",解析该字符串时索引位置1的字符是o,和报错信息完全匹配 - 额外还有一处语法错误:
pool.query调用时,SQL语句字符串和参数数组之间缺失了逗号,也会触发后续报错
解决方案
- 直接删除接口中多余的JSON解析行:
const body = JSON.parse(req.body),后续直接使用req.body取值即可 - 确认Express主入口文件(一般是index.js)中,在注册路由前已经添加了JSON解析中间件:
// 必须放在app.use('/api/user', userRouter)这类路由注册代码之前 app.use(express.json())
- 修复
pool.query的语法错误,补全SQL语句和参数数组之间的逗号:
const newUser = await pool.query( "INSERT INTO User_ (username, email, password, firstname, lastname, country_code, phone_no, address, city, state, country) VALUES ($1, $2, $3, $4,$5, $6, $7, $8, $9, $10, $11) RETURNING user_id, username", [username, email, hashed_password, firstname, lastname, country_code, phone_no, address, city, state, country] );
- 建议在接口的catch块中添加错误响应,避免前端请求超时:
catch(err){ console.log("Error : ", err); res.status(500).json({error: err.message}) }
内容的提问来源于stack exchange,提问作者SMEET KOTHARI
相关产品推荐
相关产品推荐

