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

Next.js 与 MongoDB POST请求出现500内部服务器错误求助

Next.js POST请求500错误排查与修复

问题核心

从错误栈SyntaxError: Unexpected number in JSON at position 1可直接定位:API路由中手动执行JSON.parse(req.body)是错误操作——Next.js会自动解析Content-Type: application/json的请求体,此时req.body已经是解析后的JavaScript对象,再次解析必然抛出语法错误。

修复步骤

1. 修正API路由(Posts.js)

移除手动解析req.body的代码,直接使用已解析的对象,同时适配MongoDB驱动的最新返回结构:

import clientPromise from "../../lib/mongodb";

export default async function handler(req, res) {
  const client = await clientPromise;
  const db = client.db("quick_ticker_db");

  switch (req.method) {
    case "POST":
      // 直接使用req.body,无需JSON.parse
      const insertResult = await db.collection("posts").insertOne(req.body);
      // MongoDB驱动v4+不再返回ops字段,改用insertedId获取新文档ID
      res.json({ ...req.body, _id: insertResult.insertedId });
      break;
    case "GET":
      const allPosts = await db.collection("posts").find({}).toArray();
      res.json({ status: 200, data: allPosts });
      break;
    default:
      // 处理未定义的请求方法,返回标准405错误
      res.status(405).json({ message: "Method Not Allowed" });
      break;
  }
}

2. 优化前端请求(create.js)

移除无效的encodeBodyAsJSON配置(非fetch API标准属性),并添加基础错误处理:

export default function CreateTicker() {
  const handleSubmit = async (event) => {
    event.preventDefault()

    const data = { 
      ticker: event.target.ticker.value 
    }

    const JSONdata = JSON.stringify(data)
    const endpoint = '/api/posts'

    const options = {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSONdata
    }

    try {
      const response = await fetch(endpoint, options)
      if (!response.ok) {
        throw new Error(`请求失败:${response.status}`)
      }
      const result = await response.json()
      console.log("提交成功:", result)
      // 提交成功后重置表单
      event.target.reset()
    } catch (error) {
      console.error("提交失败:", error)
    }
  }

  return (
    <form onSubmit={handleSubmit}>
      <label htmlFor="ticker">Ticker</label>
      <input type="text" id="ticker" name="ticker" required />
      <button type="submit">Submit</button>
    </form>
  )
}

验证要点

  • 确认MongoDB连接正常(GET请求正常已验证此点)
  • 测试POST请求时,查看浏览器控制台是否有新报错
  • 检查MongoDB数据库是否成功插入新文档

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:55:20