Next.js 13.4 API路由如何处理ReadableStream类型的请求体?
Next.js 13.4 API路由PATCH请求正确处理方式
问题出在Next.js 13.4 App Router的API路由机制上——这里的req.body不再是直接可用的JSON对象,而是一个ReadableStream,所以你直接解构拿到的是流对象,而非提交的用户数据。
正确的处理步骤是先解析请求体:
- 用
await req.json()替代直接解构req.body,把流转换成JSON对象 - 建议增加错误捕获逻辑,避免解析失败导致程序崩溃
- 确认
ObjectId已从mongoose正确导入
修改后的服务端代码如下:
import { NextResponse } from 'next/server'; import { Users } from '@/models/User'; // 替换为你的User模型实际路径 import { ObjectId } from 'mongoose'; const PATCH = async (req, context) => { const { id } = context.params; console.log('PATCH', id); try { // 解析请求体为JSON对象 const body = await req.json(); console.log('PATCH', body); // 使用$set操作符仅更新提交的字段,避免覆盖整个用户文档 const results = await Users.updateOne( { _id: new ObjectId(id) }, { $set: body } ); return NextResponse.json(results); } catch (error) { console.error('更新用户失败:', error); return NextResponse.json({ error: '更新失败' }, { status: 500 }); } }; export { PATCH };
额外说明:
- 你的Axios客户端代码无需修改,它会自动将
editedUser转为JSON格式,并设置正确的Content-Type请求头 - 使用
$set操作符是最佳实践,确保只会更新你提交的字段,不会覆盖用户文档中其他无需修改的内容(比如创建时间、默认权限等)
内容的提问来源于stack exchange,提问作者E M
相关产品推荐
相关产品推荐

