使用Express.js构建API并通过前端JS调用的技术问题咨询
嘿,我看你在搭建Express API时遇到了响应类型不符的问题——前端调用后拿到的是Text/HTML格式,而非预期的JSON。从你贴的代码片段来看,你已经尝试手动设置Content-Type头了,但大概率是返回数据的方式或逻辑存在疏漏,给你几个实用的解决思路:
换用
res.json()代替手动设置响应头
Express自带的res.json()方法会自动帮你设置Content-Type: application/json响应头,比手动写res.header()再发送数据靠谱得多,还能自动把JavaScript对象序列化成JSON字符串。把你的onScan函数改成这样试试:function onScan(err, data) { if (err) { console.error("Unable to read: ", JSON.stringify(err, null, 2)); // 错误场景也返回JSON格式的错误信息 return res.status(500).json({ message: "Failed to fetch accounts", error: err.message }); } // 直接返回扫描到的账户数据 res.json(data.Items); }这样就不用纠结手动设置头会不会生效的问题了。
检查中间件的顺序是否正确
如果你的项目里用了静态文件中间件(比如app.use(express.static('public'))),一定要确保API路由的定义在静态中间件之前。要是API路由写在后面,可能会被静态文件路由匹配到,返回对应的HTML文件,这就会导致响应类型变成Text/HTML。前端请求时明确指定Accept头
在前端调用API的时候,主动告诉服务器你要JSON格式的响应,比如用fetch的话:fetch('/your-api-path', { headers: { 'Accept': 'application/json' } }) .then(res => res.json()) .then(data => { // 处理拿到的JSON数据 }) .catch(err => console.error('请求出错:', err));这一步相当于给服务器发个明确的“指令”,避免因为服务器端的响应头设置疏漏导致格式不对。
补全未完成的代码逻辑
你贴的代码里return d...明显是没写完的,一定要确保onScan函数的逻辑是完整的——不管成功还是失败,都要调用res.json()或者res.send()来结束响应,不能中途中断或者没有返回任何内容,否则Express可能会默认返回一些奇怪的响应类型。
内容的提问来源于stack exchange,提问作者Vincent Nguyen

