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

NextJS Server Actions调用MySQL接口报错及无响应问题排查

Next.js Server Actions 返回NextResponse报错的解决方案

错误原因

你用错了返回方式——NextResponse是给API路由和中间件用的,Server Actions不能返回NextResponse实例。Server Actions的返回值会直接序列化后传递给客户端组件,而NextResponse是一个类对象,不符合Next.js规定的「只能传递纯对象、基础类型(字符串/数字/布尔等),不能传递类实例或无原型对象」的规则,所以触发了那个报错。

修复步骤

1. 修改Server Action的返回逻辑,直接返回纯对象

把actions.js里的NextResponse.json替换成普通对象返回,状态信息可以作为字段包含在返回对象中:

"use server";
import { createConnection } from "@/db";
// 删除NextResponse的导入
export async function login(data) {
  const { email, password } = data;
  try {
    const db = await createConnection();
    const [user] = await db.query(
      "SELECT id,firstName,lastName, image,DATE_FORMAT(birth_date, '%Y-%m-%d') as birthDate,gender, position, email, role, password,status FROM `users` WHERE email = ? AND status = 'approved'",
      [email]
    );
    if (user.length == 0) {
      // 直接返回带状态的纯对象
      return { success: false, message: "Invalid credentials.", status: 400 };
    }
    // 返回用户数据并标记成功状态
    return { success: true, data: user };
  } catch (error) {
    return { success: false, error: error.message, status: 500 };
  }
}

2. 客户端组件正确处理返回值

原来的handleSubmit直接传login无法处理返回结果,改成异步回调函数,手动获取并处理Server Action的返回值:

"use client";
import { useForm } from "react-hook-form";
import { login } from "../actions";
const LoginForm = () => {

  const form = useForm({
    defaultValues: {
      email: "",
      password: "",
    },
    reValidateMode: "onSubmit",
  });

  const { handleSubmit } = form;

  // 自定义异步提交逻辑,处理返回结果
  const onSubmit = async (data) => {
    const result = await login(data);
    if (!result.success) {
      // 登录失败,提示错误信息
      alert(result.message || result.error);
    } else {
      // 登录成功,执行后续逻辑(比如存用户信息、跳转页面)
      console.log("登录成功", result.data);
      // router.push('/dashboard')
    }
  };

  return(
    <form onSubmit={handleSubmit(onSubmit)}>
      {/* 你的表单输入字段 */}
      <button type="submit">submit</button>
    </form>
  )
}

export default LoginForm;

可选优化:用抛出错误处理异常

如果你想更贴合React Server Actions的错误处理规范,可以直接在Server Action里抛出错误,客户端用try/catch捕获:

// actions.js中修改错误判断逻辑
if (user.length == 0) {
  throw new Error("Invalid credentials.");
}
// 客户端捕获错误
const onSubmit = async (data) => {
  try {
    const result = await login(data);
    // 登录成功逻辑
  } catch (err) {
    alert(err.message);
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:30:10