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

NodeJS+Express+MySQL接口查询触发服务崩溃问题求助

问题分析与解决方案

核心问题原因

  1. 返回了错误的对象:你数据层的getPosts直接返回了database.query()的执行结果——这是一个Query实例对象,而非数据库查询返回的rows数据。该Query对象内部存在循环引用(比如_timer._object指向自身),当Express的res.json()尝试序列化它时,JSON.stringify无法处理循环引用,直接导致服务器崩溃。
  2. async/await未生效:mysql@2.x的query方法是回调式API,不会返回Promise,所以你在服务层用await根本无法等待数据库查询完成,直接拿到了未完成的Query对象就返回给了路由。

分步修复方案

1. 修正database.js:导出数据库连接对象

移除测试用的con.query,改为导出连接对象,确保其他文件能复用同一个连接:

const mysql = require("mysql");

const con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "rootpwd",
  port: 3306,
  database: "blog",
});

// 主动建立连接并处理连接错误
con.connect((err) => {
  if (err) {
    console.error("数据库连接失败:", err);
    process.exit(1);
  }
  console.log("已成功连接到MySQL数据库");
});

module.exports = con;

2. 改造数据层:将回调API包装为Promise

只有Promise才能配合async/await使用,修改数据层代码:

const database = require('./database'); // 导入数据库连接

exports.getPosts = () => {
  return new Promise((resolve, reject) => {
    database.query("select * from post;", (err, rows) => {
      if (err) {
        reject(err); // 错误时抛出异常
      } else {
        resolve(rows); // 成功时返回查询结果
      }
    });
  });
};

3. 优化服务层(可选但更规范)

保持async/await逻辑,同时确保错误能被上层捕获:

const postsData = require("../data/postsData"); // 请根据实际路径调整

exports.getPosts = async () => {
  const posts = await postsData.getPosts();
  console.log(posts, "查询到的数据");
  return posts;
};

4. 修复路由层:增加错误处理+移除冗余代码

res.json()已经会自动结束响应,无需额外调用res.end();同时增加try/catch捕获异常,避免服务器崩溃:

const express = require("express");
const router = express.Router();
const postService = require("../service/postService");

router.get("/posts", async (req, res) => {
  try {
    const posts = await postService.getPosts();
    res.status(200).json(posts);
  } catch (err) {
    // 友好返回错误信息,而非直接崩溃
    res.status(500).json({ error: "查询失败", detail: err.message });
  }
});

module.exports = router;

额外提示

如果不想手动包装Promise,可以考虑使用mysql2模块(它原生支持Promise API),代码会更简洁:

npm uninstall mysql && npm install mysql2

之后数据层可以直接写成:

const database = require('./database');

exports.getPosts = async () => {
  const [rows] = await database.query("select * from post;");
  return rows;
};

内容的提问来源于stack exchange,提问作者Guilherme Kenzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:41:23