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

Node.js+Express+EJS构建的API二次查询数据库时崩溃求助

解决Node.js + Express + EJS二次查询服务器崩溃问题

问题根源

报错error: invalid input syntax for type integer: "NaN"的核心原因有两个:

  • 二次查询或刷新时,req.params.exercise_id不是有效数字,经过parseInt转换后得到NaN,将NaN传入PostgreSQL查询时,数据库无法解析该值触发错误。
  • 代码中直接throw error未做捕获,未处理的异常会直接终止Node.js进程,导致服务器崩溃。

另外可能存在表单提交与路由不匹配的问题:若表单通过GET方式提交,默认会将参数转为查询字符串(如?exercise_id=1),但你的路由配置的是动态路由参数/:exercise_id,导致参数无法正确读取,最终得到NaN。

修复步骤

1. 完善参数验证与错误处理

修改controller.js中的getExerciseById函数,先验证参数有效性,再处理数据库查询错误:

const getExerciseById = (req, res) => {
  const exercise_id = parseInt(req.params.exercise_id);
  // 验证参数是否为有效整数
  if (isNaN(exercise_id)) {
    return res.status(400).render('error', { message: '无效的ID参数,必须输入整数' });
  }

  pool.query(queries.getExerciseById, [exercise_id], (error, results) => {
    if (error) {
      // 打印错误日志便于排查,返回友好错误响应
      console.error('数据库查询错误:', error);
      return res.status(500).render('error', { message: '查询数据失败,请稍后重试' });
    }
    res.render('exercises', { exercises: results.rows });
  });
};
  • 新增isNaN检查,提前拦截无效参数,避免传入数据库。
  • 替换throw error为错误日志+响应返回,防止服务器进程崩溃。
  • 可自定义error.ejs页面展示错误信息,提升用户体验。

2. 修正表单与路由的匹配方式

如果你的表单是通过GET提交,建议改为查询参数模式(更符合表单提交的常规用法):

修改routes.js

// 将动态路由参数改为查询参数模式
router.get("/exercises/e_id", controller.getExerciseById);

修改controller.js中参数获取方式

// 从req.query中读取参数,而非req.params
const exercise_id = parseInt(req.query.exercise_id);

修改index.ejs中的表单代码

确保表单提交的参数能被正确读取:

<form action="/exercises/e_id" method="GET">
  <input type="number" name="exercise_id" placeholder="输入运动ID" required>
  <button type="submit">查询</button>
</form>
  • type="number"限制输入为数字,减少无效提交。
  • required确保用户必须输入内容后才能提交。

3. 全局异常捕获(可选)

为了避免其他未处理的异常导致服务器崩溃,可在Express中添加全局错误处理中间件:

// 在所有路由之后添加
app.use((err, req, res, next) => {
  console.error('全局未捕获错误:', err);
  res.status(500).render('error', { message: '服务器出现异常,请稍后重试' });
});

内容的提问来源于stack exchange,提问作者Reyan Tariq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:00:17