【问题标题】:TypeError: can't access property "error", data is undefinedTypeError:无法访问属性“错误”,数据未定义
【发布时间】:2020-08-24 14:15:41
【问题描述】:

出现标题错误,无法修复 :(。我正在尝试从注册页面获取数据,这是我的 javascript 代码:

const SignupComponent = () => {
const [values, setValues] = useState({
    name: 'ryan',
    email: 'ryan@gmail.com',
    password: 'rrrrrr',
    error: '',
    loading: false,
    message: '',
    showForm: true
});

const { name, email, password, error, loading, message, showForm } = values;

const handleSubmit = e => {
    e.preventDefault();
    // console.table({ name, email, password, error, loading, message, showForm });
    setValues({ ...values, loading: true, error: false });
    const user = { name, email, password };

    signup(user).then(data => {
        if(data.error) {
            setValues({ ...values, error: data.error, loading: false });
        } else {
            setValues ({ ...values, name: '', email: '', password: '', error: '', loading: false, message: data.message, showForm: false});
        }
    });
};

const handleChange = name => e => {
    setValues({ ...values, error: false, [name]: e.target.value })

,所以当我尝试在页面中注册时,它说 TypeError: can't access property "error", data is undefined.

              signup(user).then(data => {
> 25 |             if(data.error) {
     |               ^
  26 |                 setValues({ ...values, error: data.error, loading: false });
  27 |             } else {

注册功能

export const signup = (user) => { 
    return 
    fetch(${API}/signup, { method: 'POST', 
   headers: { Accept: 'application/json', 
   'Content-Type': 'application/json' }, 
    body: JSON.stringify(user) }) 
   .then(response => { return response.json(); }) 
     .catch(err => console.log(err));

我在编程方面有点菜鸟,但我已经在互联网上寻找解决方案,没有任何工作你.U

【问题讨论】:

  • 欢迎来到 SO。 “注册”功能从何而来,它是什么样的?
  • 谢谢!它来自我的身份验证文件,它看起来像: export const signup = (user) => { return fetch(${API}/signup, { method: 'POST', headers: { Accept: 'application/json', 'Content-Type ': 'application/json' }, body: JSON.stringify(user) }) .then(response => { return response.json(); }) .catch(err => console.log(err));

标签: javascript node.js reactjs mongodb next.js


【解决方案1】:

我猜你对异步编程的概念不太熟悉。 Fetch 是一个Async 函数,如果你想等待它的输出,你必须使用Await 关键字,它还要求signup 是异步的。所以你的代码看起来像这样:

export const signup = async (user) => { 
    
    let fetchResponse = fetch(${API}/signup, { method: 'POST', 
   headers: { Accept: 'application/json', 
   'Content-Type': 'application/json' }, 
    body: JSON.stringify(user) });

    return (await fetchResponse.json())

要了解有关异步编程的更多信息,我建议阅读这篇文章https://blog.risingstack.com/node-hero-async-programming-in-node-js/

【讨论】:

    【解决方案2】:

    当您在 fetch 响应中调用 json() 方法时,将返回 Promise,因为读取流对象将异步发生。所以你要链接另一个 then 函数来获取这样的数据。

    export const signup = user => {
      return fetch(`${API}/signup`, {
        method: "POST",
        headers: { Accept: "application/json", "Content-Type": "application/json" },
        body: JSON.stringify(user)
      })
        .then(response => {
          return response.json();
        })
        .then(data => {
          return data;
        })
        .catch(err => console.log(err));
    };
    

    PS:你既不需要使用async/await,因为你正在使用带有.then()的Promises,也不需要在signup()中再使用一个.then(),因为你已经这样做了在handleSubmit() 中,您曾调用过signup()

    【讨论】:

    • 感谢 Shubham Gupta 的编辑,我忘记了 handleSubmit() 方法部分。
    • 大家好,非常感谢你们,我试过了,但现在我得到了 TypeError: Cannot read property 'error' of undefined,看起来现在它正在获取数据,但认为现在需要定义错误,我该怎么办?
    • 您好,如果数据具有error 属性,您可以通过首先记录数据来跟踪它。 `signup(user).then(data => console.log(data));
    【解决方案3】:

    尝试重写您的signup() 函数,如下所示。我猜你错过了反引号,因为我已经以类似的方式实现了 SignUp 并且它对我有用。如果有帮助,请告诉我:

    export const signup = (user) => { 
        return fetch(`${API}/signup`, {
         method: 'POST',
         headers: {
          Accept: 'application/json', 
          'Content-Type': 'application/json'
         }, 
         body: JSON.stringify(user)
        })
        .then(response => {
          return response.json();
        }) 
        .catch(err => console.log(err));
    

    PS:你既不需要使用async/await,因为你正在使用带有.then()的Promises,也不需要在signup()中再使用一个.then(),因为你已经在handleSubmit()中这样做了你打电话给signup()的地方。

    【讨论】:

    • 嗨,非常感谢,我试过了,但现在我得到 TypeError: Cannot read property 'error' of undefined,现在好像它正在获取数据,但认为现在需要定义错误,我该怎么做?
    • @MaykolSalgado 您是否尝试记录data?如果它说的是Cannot read property 'error' of undefined,那么你的data 仍然是未定义的。如果是这种情况,也许您必须检查一次您的 signup 路线。
    猜你喜欢
    • 2021-06-23
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2019-04-05
    • 2020-09-03
    相关资源
    最近更新 更多