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

Next.js 13聊天应用登录页TypeScript 'email'变量错误求助

修正Next.js 13登录页面的TypeScript 'email'变量未定义错误
  • 问题根源:你代码中直接使用了email变量,但当前作用域并未单独声明它——你把邮箱值存在了user状态对象里,所以必须从user对象中访问该属性,或者先解构出email变量。

  • 具体修正步骤:

    1. 修正Input组件的value绑定
      如果你是这样声明的状态:

      const [user, setUser] = useState<{ email: string; password: string }>({ email: "", password: "" });
      

      那么input的value不能写value={email},要改成:

      <input
        type="email"
        value={user.email}
        onChange={(e) => setUser(prev => ({ ...prev, email: e.target.value }))}
        placeholder="邮箱"
      />
      
    2. 修正signIn调用的参数
      错误的写法(直接用未定义的email):

      await signIn("credentials", { email, password, redirect: false });
      

      修正后(使用user.email):

      await signIn("credentials", { email: user.email, password: user.password, redirect: false });
      
    3. 可选:解构状态变量简化代码
      如果你不想每次都写user.email,可以在组件内解构状态对象,这样email变量就会被声明在当前作用域:

      const [user, setUser] = useState<{ email: string; password: string }>({ email: "", password: "" });
      const { email, password } = user; // 解构后可直接使用email变量
      

      之后input和signIn调用就可以直接用email了:

      <input type="email" value={email} onChange={(e) => setUser(prev => ({ ...prev, email: e.target.value }))} />
      // ...
      await signIn("credentials", { email, password, redirect: false });
      
  • 注意:这个错误和Prisma Schema、MySQL数据库的email字段无关,纯粹是TypeScript检测到你使用了未在当前作用域声明的变量,只要确保代码中用到的email是已定义的(要么是从状态对象中访问,要么是通过解构声明)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:40:26