Express+EJS项目用fetch发请求报400及JSON意外<符号错误如何解决
问题根本原因分析
两个报错存在因果关联,核心诱因是请求体格式不符合服务端预期:
1. 400 Bad Request 报错原因
你最初传入的请求体为 JSON.stringify(e.value),其中 e.value 是输入框返回的字符串类型值,序列化后得到的是顶层为纯字符串的JSON文本(比如输入关键词「test」时,实际请求体为 "test")。
而Express服务的 express.json() 中间件、或者接口隐含的参数校验规则,要求请求体必须为顶层是对象的键值对结构JSON,纯字符串类型的JSON请求不符合要求,因此直接被判定为非法请求返回400状态码。
2. JSON解析报错原因
当请求返回400状态码时,Express默认会返回HTML格式的系统错误页,响应内容的首个字符就是 <。你在请求回调中直接调用 res.json() 尝试把HTML内容解析为JSON格式,自然会触发解析失败的语法错误。
修改后生效的逻辑
你将请求体调整为 JSON.stringify({result: e.value}) 后,请求体变成了符合要求的键值对结构JSON对象,服务端可以正常接收参数并返回200状态码,响应内容为合法JSON格式,因此两处报错都会消失。
补充优化建议
你现有fetch代码中存在回调无返回值的小问题,建议调整:
const searchResults = function(e){ fetch('/elpers/search' , { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({result: e.value}) }).then(res => { return res.json() // 这里需要return才能将结果传递给下一个then }).then(data => { console.log(data) }).catch(err => { console.error(err) }) }
内容的提问来源于stack exchange,提问作者user16880202
相关产品推荐
相关产品推荐

