You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:06:00