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

NodeJS API请求无响应持续加载,MongoDB连接后无法获取数据

问题:MongoDB连接正常但请求无响应,一直加载

代码几天前运行正常,现在突然失效。程序能连接MongoDB集群,但每次发送请求都无法从数据库获取响应,请求会一直加载,取消后也无返回。已尝试重装Node、重装Mongoose、更新所有包,均无效。

现象

  • 请求发起后一直处于加载状态
  • 取消请求后无任何响应返回

server.js 代码

const express = require('express');
const bodyParser = require('body-parser');
const morgan = require('morgan');
const mongoose = require('mongoose');
const cors = require('cors')

require('dotenv/config');

const authJwt = require('./helpers/jwt')
const errorHandler = require('./helpers/error-handler')

const api = process.env.URL;

mongoose.connect(process.env.DATABASE,
    {
        useNewUrlParser:true,
        useUnifiedTopology:true
    })
.then(()=>{
    console.log('connected to database')
})
.catch((err)=>{
    console.log(err)
})

//variables
const app = express();
const port = 9090

//middleware calls
app.use(bodyParser.json());
app.use(morgan('tiny'));
app.use(express.Router())
app.use(cors());
app.options('*',cors())
app.use(errorHandler)
app.use(authJwt)

const categoriesRouter = require('./routers/categories')
const productsRouter = require('./routers/products')
const ordersRouter = require('./routers/orders')
const usersRouter  = require('./routers/users')

//Routers
app.use(`${api}/categories`,categoriesRouter)
app.use(`${api}/products`,productsRouter)
app.use(`${api}/users`,usersRouter)

app.listen(port,(req,res)=>
{
    console.log('server is running in port '+ port )
})

分类路由代码示例

const {Category} = require('../models/category')
const express = require('express');

const router = express.Router();

router.get('/',async(req,res)=>{
    const categoryList = await Category.find();

    if(!categoryList)
    {
        res.status(500).json({success:false})
    }
    res.status(200).send(categoryList);
})

router.get('/:id',async(req,res)=>{
    const category = await Category.findById(req.params.id)

    if(!category)
    {
        res.status(500).json({message:'The category with the given ID'})
    }

    res.status(200).send(category)
})

router.post('/',async(req,res)=>{
    let category = new Category({
        name:req.body.name,
        icon:req.body.icon,
        color:req.body.color
    })

    category = await category.save();

    if(!category)
    return res.status(404).send('the fag category cannot be created')

    res.send(category)
})

router.delete('/:id', (req,res)=>{
    Category.findByIdAndRemove(req.params.id).then(category=>{
        if(category)
        {
            return res.status(200).json({success:true,message:'the category is deleted'})
        }
        else
        {
            return res.status(404).json({success:false,message:'the category is not found'})
        }
    }).catch(err=>{
        return res.status(400).json({success:false , error: err})
    })
})

router.put('/:id',async (req,res)=>{
    const category = await Category.findByIdAndUpdate(
        req.params.id,
        {
            name:req.body.name,
            icon:req.body.icon,
            color:req.body.color
        },
        { new:true }
    )
    
    if(!category)
    {
        return res.status(400).send('The category cannot be created!');
    }
    res.send(category);
})

module.exports = router;

排查方向与解决方法

  1. 修正中间件顺序
    错误处理中间件必须放在路由之后,否则会拦截正常请求;同时移除多余的空路由挂载:

    // 正确的中间件顺序
    app.use(bodyParser.json());
    app.use(morgan('tiny'));
    app.use(cors());
    app.options('*',cors())
    app.use(authJwt) // 先执行JWT验证
    // 先挂载所有路由
    app.use(`${api}/categories`,categoriesRouter)
    app.use(`${api}/products`,productsRouter)
    app.use(`${api}/users`,usersRouter)
    // 最后挂载错误处理中间件
    app.use(errorHandler)
    // 删掉这行无用代码:app.use(express.Router())
    
  2. 捕获异步代码异常
    所有async路由必须包裹try/catch,否则数据库查询抛出异常会导致请求挂起:

    router.get('/',async(req,res)=>{
        try {
            const categoryList = await Category.find();
            res.status(200).send(categoryList);
        } catch (err) {
            res.status(500).json({success:false, error: err.message})
        }
    })
    
  3. 验证MongoDB连接稳定性
    添加连接状态监听,确认是否存在后续断开的情况,同时检查MongoDB集群的IP白名单是否变更:

    const db = mongoose.connection;
    db.on('disconnected', () => {
        console.log('MongoDB disconnected');
    });
    db.on('error', (err) => {
        console.log('MongoDB connection error:', err);
    });
    
  4. 检查环境变量
    确认process.env.DATABASE和process.env.URL取值未被意外修改,比如URL前缀是否正确导致路由匹配失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:50:37