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();
额外优化建议
- 用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}); } });
- 模型代码中
const { schema } = require('./User');未被使用,可删除以减少冗余。
内容的提问来源于stack exchange,提问作者Mirza M Azeem
相关产品推荐
相关产品推荐

