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

运行时出现TypeError: Cannot read properties of undefined (reading 'error')求助

登录成功后仍弹出TypeError: Cannot read properties of undefined (reading 'error')问题排查

问题描述

运行代码时遇到错误:TypeError: Cannot read properties of undefined (reading 'error'),登录功能可成功完成,但屏幕底部仍会弹出该错误。

相关代码

登录组件代码

export const LoginForm = () => {
    
    const [error, setError] = useState<string | undefined>("");
    const [success, setSuccess] = useState<string | undefined>("");
    const [isPending, startTransition] = useTransition();

const form =useForm<z.infer<typeof LoginSchema>>({

    resolver: zodResolver(LoginSchema),
    defaultValues: {
        email:"",
        password:"",

    },

});

const onSubmit = (values: z.infer<typeof LoginSchema>) => {
    
    setError("");
    setSuccess("");
    
    startTransition(() => {

        login(values)
        .then((data) => {
            setError(data.error);
            setSuccess(data.success);
        });
        
    });

login函数代码

"use server";

import * as z from "zod";
import { AuthError } from "next-auth";
import { signIn } from "@/auth";
import { LoginSchema } from "@/schemas";
import { DEFAULT_LOGIN_REDIRECT } from "@/routes";

export const login = async(values: z.infer<typeof LoginSchema>) => {
    
const validatedFields = LoginSchema.safeParse(values);

    if (!validatedFields.success) {
        return { error: "Invalid fields!"};
    }

const { email, password } = validatedFields.data;

try {

    await signIn("credentials", {
        email,
        password,
        redirectTo: DEFAULT_LOGIN_REDIRECT
    })

} catch (error) {
    if(error instanceof AuthError) {
        
        switch(error.type) {
        case "CredentialsSignin":
            return { error: "Invalid credentials!"}

        default:
            return { error: "Something went wrong!"}           
            
        }
    
    }

    throw error;

}

};

登录成功后返回的用户信息

{
  "user": {
    "name": "kalyan Thatavarti",
    "email": "kalyan.thatavarti@gmail.com",
    "image": null
  },
  "expires": "2024-11-29T18:49:11.316Z"
}

问题原因

当登录成功时,login函数的try块中执行完await signIn(...)后,没有返回任何值,导致login(values).then(data => ...)中的data为undefined。此时尝试访问data.error就会触发TypeError。

解决方案

1. 修改login函数,登录成功时返回success信息

在login函数的try块中,await signIn执行成功后,添加返回语句:

try {
    await signIn("credentials", {
        email,
        password,
        redirectTo: DEFAULT_LOGIN_REDIRECT
    });
    // 登录成功时返回success字段
    return { success: "登录成功!" };
} catch (error) {
    // 原有错误处理逻辑不变
}

2. 组件中增加data存在性判断,避免访问undefined属性

修改onSubmit中的then回调,先判断data是否存在再访问其属性:

login(values)
.then((data) => {
    setError(data?.error);
    setSuccess(data?.success);
});

或者更严谨的写法:

login(values)
.then((data) => {
    if (data) {
        setError(data.error);
        setSuccess(data.success);
    } else {
        // 登录成功且无返回数据时,可手动设置success提示
        setSuccess("登录成功!");
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 19:04:51