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

Node.js中Fetch GET请求致服务端日志停止且程序崩溃问题排查

可能的错误原因及排查方案

结合你描述的现象(服务端打印几次后崩溃),大概率是未处理的异常或资源耗尽导致Node.js进程退出,以下是具体分析和解决方向:

1. 未处理的异步错误/Promise拒绝

如果服务端GET路由里包含异步操作(比如MongoDB查询),但没做错误捕获,一旦某次请求触发异常(比如数据库查询失败、参数格式错误),未被捕获的错误会直接终止Node.js进程。

修正示例:

给异步路由加上try/catch包裹所有逻辑:

app.get('/fetch-date', async (req, res) => {
  try {
    const targetDate = req.query.date;
    console.log('Received date:', targetDate);
    // 你的MongoDB查询或其他异步操作
    const events = await db.collection('events').find({ date: targetDate }).toArray();
    res.json({ success: true, events });
  } catch (err) {
    // 打印错误日志并返回客户端错误响应
    console.error('Request failed:', err);
    res.status(500).json({ success: false, error: 'Internal server error' });
  }
});

2. MongoDB连接资源耗尽

如果你的代码每次请求都新建MongoDB连接,而非复用全局连接,多次请求后会达到数据库连接上限,导致后续请求失败并引发服务端崩溃。

修正方案:

服务启动时一次性建立MongoDB连接,全局复用:

const { MongoClient } = require('mongodb');
let db;

// 仅在服务启动时连接一次数据库
MongoClient.connect('mongodb://localhost:27017/calendar')
  .then(client => {
    db = client.db('calendar');
    console.log('MongoDB connected successfully');
    // 连接成功后再启动HTTP服务
    app.listen(3000, () => console.log('Server running on port 3000'));
  })
  .catch(err => console.error('MongoDB connection failed:', err));

// 路由中直接使用已连接的db实例
app.get('/fetch-date', async (req, res) => {
  try {
    const targetDate = req.query.date;
    console.log('Received date:', targetDate);
    const events = await db.collection('events').find({ date: targetDate }).toArray();
    res.json(events);
  } catch (err) {
    console.error('Request error:', err);
    res.status(500).send('Server error');
  }
});

3. 客户端请求过于频繁(无防抖)

切换月份时如果没做防抖处理,快速点击会在短时间内发送大量GET请求,服务端可能因资源占用过高崩溃,或触发数据库限流机制。

修正方案:

给客户端的切换月份函数添加防抖:

// 防抖工具函数
function debounce(func, delay = 300) {
  let timeoutId;
  return (...args) => {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => func.apply(this, args), delay);
  };
}

// 用防抖包裹切换月份逻辑
const switchMonth = debounce(async (newMonth) => {
  generateCalendar(newMonth);
  const res = await fetch(`/fetch-date?month=${newMonth}`);
  const data = await res.json();
  // 处理返回数据
});

4. 未监听服务端错误事件

如果HTTP服务器的error事件未被监听,一旦发生底层错误(比如端口被占用、连接中断),Node.js进程会直接退出。

补充代码:

const server = app.listen(3000, () => console.log('Server running'));

// 监听服务器错误,避免进程直接崩溃
server.on('error', (err) => {
  console.error('Server error occurred:', err);
});

排查第一步:查看崩溃日志

启动服务时用node --trace-warnings server.js运行,或查看进程崩溃时的控制台输出,错误堆栈信息是定位问题最直接的依据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:20:23