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

Node.js后端新增分类接口致应用崩溃,附代码及报错求助

Node.js分类数据入库时应用崩溃问题排查

问题背景

我的Node.js后端代码用于将分类(Category)及slug存入数据库,但应用出现崩溃情况,以下是相关代码及报错信息,请求排查问题原因。

路由代码

const express=require('express');
const Category = require("../models/Category");
const slugify=require('slugify');
const router=express.Router; // 问题所在行


router.post('/addcategory',(req,res)=>{

 const categoryObj={
    name:req.body.name,
    slug:slugify(req.body.name)
 }

 if(req.body.parentId){
    
 categoryObj.parentId=req.body.parentId;

}

const cat=new Category(categoryObj);

cat.save((error,Category)=>{
    if(error) return res.status(400).json({error});
    if(Category){
        return res.status(201).json({Category});
    }
})

});

module.exports=router;

MongoDB模型代码

const mongoose = require('mongoose');
const { schema } = require('./User');
const { Schema } = mongoose;

const CategorySchema=new Schema({

name:{
    type:String,
    required:true,
    trim:true
},
slug:{
    type:String,
    required:true,
    unique:true
},
parentId:{
    type:String
}

});
const Category=mongoose.model('Category',CategorySchema);
module.exports=Category;

入口文件index.js代码

const connectToMongo=require('./db');
var cors = require('cors');
const express = require('express')

connectToMongo();
const app = express()
app.use(cors())
const port = 5000


app.use(express.json());
app.use('/api/authent',require('./routes/authent'))
app.use('/api/category1',require('./routes/category'))


app.listen(port, () => {
  console.log(`iNoteBook Backend listening on port ${port}`)
})

终端报错信息

C:\Users\Dell\Desktop\cinemaapp\backend\node_modules\express\lib\router\index.js:513
this.stack.push(layer);
^

TypeError: Cannot read properties of undefined (reading 'push')
at Function.route (C:\Users\Dell\Desktop\cinemaapp\backend\node_modules\express\lib\router\index.js:513:14)
at Function.proto. [as post] (C:\Users\Dell\Desktop\cinemaapp\backend\node_modules\express\lib\router\index.js:520:22)
at Object. (C:\Users\Dell\Desktop\cinemaapp\backend\routes\category.js:8:8)
at Module._compile (node:internal/modules/cjs/loader:1105:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Module.require (node:internal/modules/cjs/loader:1005:19)
at require (node:internal/modules/cjs/helpers:102:18)
at Object. (C:\Users\Dell\Desktop\cinemaapp\backend\index.js:13:26)
[nodemon] app crashed - waiting for file changes before starting...

问题原因及解决方案

问题根源

路由代码中const router=express.Router;未调用Router函数生成实例。express.Router是构造函数,必须通过()调用才能创建可使用的路由实例,否则router只是函数引用,调用router.post()时会因内部属性未初始化抛出Cannot read properties of undefined (reading 'push')错误。

修复方案

将路由代码中的问题行修改为:

const router=express.Router();

额外优化建议

  1. 用async/await替代回调函数处理数据库操作,代码更易读且便于错误捕获:
router.post('/addcategory', async (req,res)=>{
  try {
    const categoryObj={
      name:req.body.name,
      slug:slugify(req.body.name)
    }
    if(req.body.parentId){
      categoryObj.parentId=req.body.parentId;
    }
    const cat=new Category(categoryObj);
    const savedCategory = await cat.save();
    return res.status(201).json({Category: savedCategory});
  } catch(error) {
    return res.status(400).json({error});
  }
});
  1. 模型代码中const { schema } = require('./User');未被使用,可删除以减少冗余。

内容的提问来源于stack exchange,提问作者Mirza M Azeem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:20:21