Не могу понять, почему длина массива не определена - PullRequest
0 голосов
/ 10 мая 2019

Я продолжаю получать следующее сообщение в консоли: «Uncaught (в обещании) TypeError: Невозможно прочитать свойство 'length' of undefined"

quotesData.quotes должен быть ключом для массива, однако, поэтомуЯ не уверен, почему его свойство длины не определено.

quotesData должен быть объектом JSON, который выглядит следующим образом: {"quotes": [Object1, Object2, ... и т. Д.]}

Что-то не так с тем, как я использую axios?Я все еще очень новичок в программировании в целом и совершенно новый, чтобы реагировать. Js

getQuote() {
    let _this = this;
    _this.serverRequest =
        axios
        .get("https://raw.githubusercontent.com/dwgillette/quotes/master/library")
        .then(function(quotesData) { 
            console.log(quotesData);
            let newQuote = quotesData.quotes[Math.floor(Math.random() * quotesData.quotes.length)];
            _this.setState({
                quote: newQuote.quote,
                author: newQuote.author
            });
        })
}

Ответы [ 3 ]

0 голосов
/ 10 мая 2019

Таким образом, данные, которые вы хотите, фактически будут иметь атрибут .data ответа. Так что, если вы исправите свой код таким образом, вам будет хорошо:)

getQuote() {
    let _this = this;
    _this.serverRequest =
        axios
        .get("https://raw.githubusercontent.com/dwgillette/quotes/master/library")
        .then(function(q) { 
            quotesData = q.data;
            console.log(quotesData);
            let newQuote = quotesData.quotes[Math.floor(Math.random() * quotesData.quotes.length)];
            _this.setState({
                quote: newQuote.quote,
                author: newQuote.author
            });
        })
}
0 голосов
/ 11 мая 2019

Вот скриншот объекта ответа, который вы получаете обратно.

Я реорганизовал твой код для работы. вам нужно использовать res.data.

getQuote = () => {axios.get("https://raw.githubusercontent.com/dwgillette/quotes/master/library")
.then(res => {
  let newQuote =
    res.data.quotes[Math.floor(Math.random() * res.data.quotes.length)];

  this.setState({
    quote: newQuote.quote,
    author: newQuote.author
  });
});
};
0 голосов
/ 10 мая 2019

Потому что обещание разрешается для объекта ответа.Попробуйте сделать:

getQuote() {
let _this = this;
_this.serverRequest =
    axios
    .get("https://raw.githubusercontent.com/dwgillette/quotes/master/library")
    .then(function(response) { 
        let newQuote = response.data.quotes[Math.floor(Math.random() * response.data.quotes.length)];
        _this.setState({
            quote: newQuote.quote,
            author: newQuote.author
        });
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...