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

NextJS13+Mongoose提交嵌套数据POST请求时messages字段未创建

问题:NextJS 13 + Mongoose 无法保存嵌套的messages数组字段

使用NextJS 13和Mongoose开发时,发送包含嵌套messages数组的POST请求,成功创建文档但messages字段未被写入数据库,响应结果中也缺少该字段。

请求数据

{
    "userEmail": "test@gmail.com",
    "level": "3",
    "messages": [{"content":"What is your name?\n","role":"user","createdAt":"2023-10-26T18:30:11.460Z","id":"akNgQwb"},{"id":"I61VGsq","createdAt":"2023-10-26T18:30:12.605Z","content":"My name is Jack.","role":"assistant"}]
}

响应结果

{
    "userEmail": "test@gmail.com",
    "level": "3",
    "_id": "653d86b99d2e1c46cceb618b",
    "__v": 0
}

Mongoose Schema 定义

const { Schema, default: mongoose } = require('mongoose')

const writingSchema = new Schema({
  userEmail: String,
  level: String,
  messages: [
    {
      content: String,
      role: String,
      createdAt: Date,
      id: String,
    },
  ],
})

const Writing =
  mongoose.models.Writing || mongoose.model('Writing', writingSchema)

export default Writing

API 代码

import connectMongo from '@/lib/mongodb'
import Writing from '@/models/writing.model'

export default async function handler(req, res) {
  connectMongo().catch((err) =>
    res.status(400).json({ error: 'DB connection error!' }),
  )
  const { userEmail, level, messages } = req.body

  switch (req.method) {
    case 'POST':
      try {
        const newWriting = new Writing({
          userEmail,
          level,
          messages,
        })
        await newWriting.save()
        res.status(201).json(newWriting)
      } catch (error) {
        res
          .status(500)
          .json({ error: 'An error occurred while saving the writing' })
      }
      break
    default:
      res.setHeader('Allow', ['GET', 'POST'])
      res.status(400).json({ error: `Method ${req.method} not allowed!` })
      break
  }
}

可能的原因及解决方法

1. NextJS 13 App Router 未手动解析请求体

如果API路由位于app目录下(App Router),NextJS不会自动解析请求体,req.body是可读流,直接解构会导致messages为undefined,因此保存时不会写入该字段。

修改API代码,先解析请求体:

import connectMongo from '@/lib/mongodb'
import Writing from '@/models/writing.model'

export default async function handler(req, res) {
  connectMongo().catch((err) =>
    res.status(400).json({ error: 'DB connection error!' }),
  )
  
  // 解析请求体
  const body = await req.json()
  const { userEmail, level, messages } = body

  switch (req.method) {
    case 'POST':
      try {
        const newWriting = new Writing({
          userEmail,
          level,
          messages,
        })
        await newWriting.save()
        res.status(201).json(newWriting)
      } catch (error) {
        console.error(error)
        res.status(500).json({ 
          error: 'An error occurred while saving the writing', 
          details: error.message 
        })
      }
      break
    default:
      res.setHeader('Allow', ['GET', 'POST'])
      res.status(400).json({ error: `Method ${req.method} not allowed!` })
      break
  }
}

2. 验证请求数据传递是否正确

在API中添加日志,确认messages是否被正确接收:

console.log('Received messages:', messages)

如果输出为undefined,需检查:

  • 前端请求是否设置了Content-Type: application/json
  • 请求体格式是否正确,无语法错误

3. 优化Schema定义(可选)

为messages字段添加默认值,确保文档始终包含该字段:

const writingSchema = new Schema({
  userEmail: String,
  level: String,
  messages: {
    type: [
      {
        content: String,
        role: String,
        createdAt: Date,
        id: String,
      },
    ],
    default: []
  },
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:26:01