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

生产环境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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:45:55