可能未处理的promise promise(id:0)null不是对象

时间:2017-03-27 12:11:55

标签: node.js mongodb react-native expo

所以我一直在研究一个反应原生应用程序,就像meetups应用程序一样。 它有自己的node.js后端,可以在这里查看 https://github.com/rahullakhaney/meetup/tree/master/meetup-backend 在我的应用程序中,我试图从我的数据库填充组,我得到此错误“可能未处理的承诺拒绝(id:0)null不是对象”

这是我的api.js文件

import axios from 'axios';

axios.defaults.baseURL = 'http://localhost:3000/api';

const fakeGroupId = '58d64e3a122149dd3cdba5d8';

class MeetupApi {
  constructor() {
    this.groupId = fakeGroupId;
    this.path = `/groups/${this.groupId}/meetups`;
  }

  async fetchGroupMeetups() {
    const { data } = await axios.get(this.path);

    return data.meetups;
  }

}

export {
  MeetupApi
};

您还可以在https://github.com/rahullakhaney/meetup/tree/master/meetup-mobile

查看完整代码

任何人都可以解释为什么我会收到此错误,对不起,但我是新来的反应原生。

1 个答案:

答案 0 :(得分:0)

使用async关键字声明的每个函数或方法都会返回一个promise。当您从该函数返回某些内容时,该承诺将得到解决,并且当您在该函数中抛出异常时,该承诺将被拒绝。

当你这样写:

const { data } = await axios.get(this.path);

然后真正发生的事情是你将解析回调添加到axios.get()返回的承诺中,但axios.get()返回的每个拒绝承诺都会在fetchGroupMeetups()内引发异常方法。您不使用try / catch以便异常传播,而是转换为对fetchGroupMeetups()返回的promise的拒绝 - 您可能无法处理它。

要处理拒绝,您需要将其用作以下内容:

x.fetchGroupMeetups(...).catch(err => console.log('Error:', err));

或者,在其他async函数内部:

try {
  x.fetchGroupMeetups(...);
} catch (err) {
  console.log('Error:', err);
}

但当然要做的不仅仅是打印错误。

要了解更多有关未处理拒绝的详细信息以及为何应始终处理这些拒绝,请参阅以下答案:

TL; DR:未处理的拒绝曾经是警告,但现在会崩溃你的应用程序。 Here就是原因。