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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:22:17