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
相关产品推荐
相关产品推荐

