生产环境Nginx返回非application/json响应,本地/预发环境正常
排查
get-courses接口返回Content-Type异常的原因 1. 数据库查询异常触发Express默认HTML错误页
你的getTipsCourses函数没有错误捕获逻辑,一旦getCourses中的数据库查询抛出异常,Express会返回默认的HTML格式错误页面(而非JSON),这直接导致前端收到text/html类型响应。
其他接口(如get-teachers)正常,说明生产环境中仅courses表的查询存在问题,可能的具体原因:
courses表的picture字段数据异常:比如字段不是bytea类型,或存储的二进制数据损坏,导致encode(picture, 'base64')执行失败active字段类型不匹配:若生产库中active不是布尔类型,WHERE active IS TRUE会触发语法或数据类型错误- 数据库权限问题:生产环境的数据库用户没有
courses表的查询权限
临时排查方案:给getTipsCourses添加错误捕获,强制返回JSON格式错误:
export async function getTipsCourses(req: Request, res: Response) { try { const articles = await getCourses(); return res.status(OK).send(articles); } catch (err) { console.error('获取课程失败:', err); return res.status(500).json({ error: '获取课程列表失败' }); } }
同时查看生产环境的Express日志,定位具体的数据库错误信息。
2. 缺少全局错误处理中间件
Express默认对未捕获的异步错误返回HTML错误页,若你的项目没有全局错误处理中间件,会导致异常接口返回text/html类型响应。
修复方案:添加全局错误处理中间件,确保所有错误都返回JSON:
import { Request, Response, NextFunction } from "express"; app.use((err: Error, req: Request, res: Response, next: NextFunction) => { console.error(err.stack); res.status(500).json({ message: err.message || '服务器内部错误' }); });
3. Nginx配置或静态文件干扰(可能性较低)
虽然当前Nginx配置将所有请求代理到localhost:3000,但仍需排查:
/var/www/tipsforfamilies/html目录下是否存在与get-courses同名的静态文件(如get-courses.html),导致Nginx优先返回静态文件而非代理请求- 检查Nginx是否有其他未展示的
location规则,拦截了/tips/get-courses请求
4. 数据库连接池资源耗尽
若生产环境数据库连接池的max配置过小,getCourses中pool.connect()可能等待超时,触发异常后返回HTML错误页。可检查数据库连接池配置,适当调高max值:
// db/index.ts 示例配置 const pool = new Pool({ user: 'xxx', host: 'xxx', database: 'xxx', password: 'xxx', port: 5432, max: 10, // 根据并发量调整 idleTimeoutMillis: 30000, });
内容的提问来源于stack exchange,提问作者umbe1987
相关产品推荐
相关产品推荐

