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

Mongoose 7.0.4下Note.create阻塞无响应问题求助

MERN栈POST请求卡在Note.create无响应排查

问题场景

在完成Dave Grey的MERN栈实操时,POST请求创建Note时卡在Note.create行,服务器无响应,且try catch块未抛出任何错误。控制台能打印到用户查询结果,但End of Note.create从未输出。

相关代码

POST请求处理函数

const createNewNote = asyncHandler(async (req, res) => {
    const { user, title, text } = req.body

    // 验证数据完整性
    if (!user || !title || !text) {
        return res.status(400).json({ message: '所有字段均为必填项' })
    }
    console.log("Data Confirmed")

    // 检查标题重复
    const duplicate = await Note.findOne({ title }).lean().exec()

    if (duplicate) {
        return res.status(409).json({ message: '笔记标题已存在' })
    }
    console.log("No duplicates")

    // 创建并存储新笔记
    console.log("Starting creation")
        
        const useruser = await User.findById(user).exec()
        console.log(useruser)
        
        const noteObject = {"user" : useruser._id, title, text}
        const note = await Note.create(noteObject)
 
    
    console.log("End of Note.create")
    if (note) { // 创建成功
        return res.status(201).json({ message: '新笔记创建成功' })
    } else {
        return res.status(400).json({ message: '收到无效的笔记数据' })
    }

})

User Schema

const mongoose = require('mongoose')

const userSchema = new mongoose.Schema({
    username: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    roles: [{
        type: String,
        default: "Employee"
    }],
    active: {
        type: Boolean,
        default: true
    }
})

module.exports = mongoose.model('User', userSchema)

Note Schema

const mongoose = require('mongoose')
const AutoIncrement = require('mongoose-sequence')(mongoose)

const noteSchema = new mongoose.Schema(
    {
        user: {
            type: mongoose.Schema.Types.ObjectId,
            required: true,
            ref: 'User',
        },
        title: {
            type: String,
            required: true
        },
        text: {
            type: String,
            required: true
        },
        completed: {
            type: Boolean,
            default: false
        },
    },
    {
        timestamps: true
    }
)

noteSchema.plugin(AutoIncrement, {
    inc_field: 'ticket',
    id: 'ticketNums',
    start_seq: 500
})

module.exports = mongoose.model('Note', noteSchema)

控制台输出

POST /notes Data Confirmed No duplicates Starting creation
{
  _id: new ObjectId("64440dcbf47f80931a244dd2"),
  username: 'DanD',
  password:'$2b$10$R7cbeKxN4d8wSNLtShZ4
  MOcwaNfdMApAdYDwYsVA2ofAfcU 
  kju0fm',
  roles: [ 'Admin', 'Owner', 'Manager' ],
  active: true,
  __v: 0
}

Postman请求Payload

{
    "user": "64440dcbf47f80931a244dd2",
    "title": "Mrs. Smith's Computer",
    "text": "SSD is down"
}

排查方向与解决方案

1. 排查mongoose-sequence插件问题

Note.create卡住大概率和AutoIncrement插件有关:

  • 确认mongoose-sequence版本与当前mongoose版本兼容,匹配插件文档要求的版本范围
  • 检查MongoDB中是否存在ticketNums集合,若不存在可手动创建,或重启服务让插件自动生成
  • 临时注释AutoIncrement插件代码,测试能否正常创建Note,若能则定位到插件配置问题

2. 手动捕获Note.create错误

在Note.create周围添加独立try-catch,强制捕获错误信息:

try {
    const note = await Note.create(noteObject)
    console.log("End of Note.create")
    if (note) {
        return res.status(201).json({ message: '新笔记创建成功' })
    } else {
        return res.status(400).json({ message: '收到无效的笔记数据' })
    }
} catch (err) {
    console.error('创建笔记失败:', err)
    return res.status(500).json({ message: '服务器内部错误', error: err.message })
}

3. 简化代码逻辑

无需额外查询User,直接使用请求中的user ID(已验证用户存在):

// 移除User.findById查询
const noteObject = { user, title, text }

Mongoose会自动将字符串格式的ObjectId转换为对应类型,减少不必要的数据库查询。

4. 检查数据库连接状态

确认mongoose与MongoDB的连接稳定,可添加连接状态监听:

const db = mongoose.connection
db.on('error', console.error.bind(console, 'MongoDB连接错误:'))
db.once('open', () => {
    console.log('MongoDB连接成功')
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:05:19