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;
排查方向与解决方法
修正中间件顺序
错误处理中间件必须放在路由之后,否则会拦截正常请求;同时移除多余的空路由挂载:// 正确的中间件顺序 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())捕获异步代码异常
所有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}) } })验证MongoDB连接稳定性
添加连接状态监听,确认是否存在后续断开的情况,同时检查MongoDB集群的IP白名单是否变更:const db = mongoose.connection; db.on('disconnected', () => { console.log('MongoDB disconnected'); }); db.on('error', (err) => { console.log('MongoDB connection error:', err); });检查环境变量
确认process.env.DATABASE和process.env.URL取值未被意外修改,比如URL前缀是否正确导致路由匹配失败。
内容的提问来源于stack exchange,提问作者Jooh Ny
相关产品推荐
相关产品推荐

