Как получить данные API с помощью выборки в NodeJS

#javascript #use-effect

#javascript #использование-эффект

Вопрос:

У меня есть этот api, который возвращает массивы значений:

 app.get("/events", (req, res) => {
  let response = null;
  let authObj = auth.authorize();

  setTimeout(() => {
    let result = controller.listEvents(authObj);

    result.then((data) => {
      response = data;
      console.log(data)
      res.json(response); // is this way of passing this data object to front-end right ???
    });
  }, 2000);
});

  

результат console.log(data) выше выглядит следующим образом:

 [
  {
    kind: 'calendar#event',
    etag: '"3203302285276000"',
    id: '69jte9qmoij84irjf2ktlqlqcd',
    status: 'confirmed',
    htmlLink: 'https://www.google.com/calendar/event?eid=NjlqdGU5cW1vaWo4NGlyamYya3RscWxxY2QgYmFudWthamFuYW5hdGhqYXlhcmF0aG5hQG0',
    created: '2020-10-02T15:05:42.000Z',
    updated: '2020-10-02T15:05:42.638Z',
    summary: 'What’s New in Lens 3.6.0',
  },
  {
    kind: 'calendar#event',
    etag: '"3200206562152000"',
    id: '_6l6jehjbbtol8him9194uqr88907cjaoct3japrle5a3ii9o6ds62t3kcln68pb5',
    status: 'confirmed',
    htmlLink: 'https://www.google.com/calendar/event?eid=XzZsNmplaGpiYnRvbDhoaW05MTk0dXFyODg5MDdjamFvY3QzamFwcmxlNWEzaWk5bzZkczYydDNrY2xuNjhwYjUgYmFudWthamFuYW5hdGhqYXlhcmF0aG5hQG0',
    created: '2020-09-14T17:07:55.000Z',
    updated: '2020-09-14T17:08:01.076Z',
    summary: 'Ansible Contributor Summit - New Contributor Workshops',
   
  }
]
  

И я хочу передать это data в свой интерфейс и выполнить итерацию по нему, чтобы отобразить summary , status .

Вот как я получаю это значение в свой интерфейс:

  const [data, setData] = useState([]);
 useEffect(() => {
    fetch("/events").then((res) => {
      console.log(res);
      setData(res.data);
    });
  });
  

Но когда я пытаюсь распечатать data , он выдает undefined

Может кто-нибудь мне помочь?

Спасибо!

Ответ №1:

Параметр является ответом. Это не результат запроса, он содержит только заголовки. Вам нужно

  const [data, setData] = useState([]);
 useEffect(() => {
    fetch("/events").then(res => res.json()).then((res) => {
      console.log(res);
      setData(res);
    });
  }, []);
  

Помните пустой массив зависимостей. Вы не хотите извлекать данные каждый раз, когда компонент отображает, только один раз.

Результат не имеет свойства data, это просто массив. Так что используйте setData(res); , а не setData(res.data);

Ответ №2:

Попробуйте, потому что вы ожидаете json

 const [data, setData] = useState([]);
 useEffect(() => {
    fetch("/events").then((res) => {  
    return res.json()
    }).then((responseJson) => {
       console.log(responseJson);
    });
  
  });
  

Комментарии:

1. Спасибо, но где я должен установить setData ?

2. Вы можете установить данные там, где я регистрирую responseJSON в консоли, проверить этот объект и установить там данные

3. Хорошо, и как я могу получить доступ к summary и status из этого объекта jason? {data.map(function (item, i) { return <li key={i}>{item.summary}</li>; })} нравится это?