javascript – Как исправить ‘Cannot read property’, включающий ‘undefined’ в nodejs? [Script ] –

Почему возникает ошибка cannot read property ‘map’ of undefined?

const [users, setUsers] = useState({user:['user1', 'user2', 'user3']});

Здесь users это объект, единственное свойство которого является массивом.

setUsers(users.user.filter((item,i) => i !== index));

А здесь – массив.

const list = users.user.map(...

У этого массива вы пытаетесь прочитать свойство user, которого нет, получаете undefined, а дальше… Ну, сообщение об ошибке вы уже видели.

Вы бы определились, чем должен быть users.

Uncaught typeerror: cannot read property — что это означает – журнал «код» программирование без снобизма

Допустим, вы делаете страницу с формой и полем ввода:

<form name="myform">
<input name="myinput" value="10" />
</form>

Нужно, чтобы скрипт нашёл эту форму, достал из неё значение поля ввода и вывел его на экран. Вы пишете скрипт и оформляете его как отдельный файл, который подключаете в разделе head:

<script>
var str = '';
for(i=0; i < document.myform.elements.length; i ){
str = document.myform.elements[i].name
'=' encodeURIComponent(document.myform.elements[i].value)
(i == document.myform.elements.length -1 ? '' : '&');
}
alert(str);
</script>

Этот скрипт должен быть правильным. При тестировании внутри консоли он делает именно то, что нужно. Но после запуска скрипт падает с ошибкой:

❌ Uncaught TypeError: Cannot read property

Это означает: «Вы пытаетесь прочитать у объекта какое-то свойство, но я не могу его найти, а значит, не могу и прочитать то, чего нет».

Странно, ведь вы уверены, что у этого объекта такое свойство точно есть, и вы сто раз так уже делали.

Всё так и одновременно не так.

Эта ошибка чаще всего происходит, когда вы обращаетесь к свойствам объекта раньше, чем объект готов:

  • Скорее всего, объект ещё не загрузился.
  • Может быть, этот объект должен появиться на странице по скрипту, который ещё не выполнился.
  • Допущена опечатка в названии объекта, поэтому при обращении к нему скрипт его не находит.

Наш случай — первый и самый распространённый: мы вызываем скрипт в разделе <head>, но форма у нас ещё не готова — она банально не загружена в документ, поэтому скрипт не может прочитать свойства несуществующей формы.

Чтобы избавиться от этой ошибки, нужно добавить в вызов скрипта атрибут defer — он заставит скрипт подождать, пока страница загрузится полностью, вместе с формой.

<script defer src="...">

Второй вариант — поместить вызов скрипта сразу после формы, тогда к моменту вызова всё окажется на своих местах и ошибки не будет. Или вообще в конце всего документа.

Follow the clues: how to diagnose the error

So the stack trace told us where to look: line 9 of App.js. Let’s open that up.

Here’s the full text of that file:

Line 9 is this one:

Читайте также:  Работа с КриптоПро на linux сервере

And just for reference, here’s that error message again:

Let’s break this down!

  • TypeError is the kind of error

There are a handful of built-in error types. MDN says TypeError “represents an error that occurs when a variable or parameter is not of a valid type.” (this part is, IMO, the least useful part of the error message)

  • Cannot read property means the code was trying to read a property.

This is a good clue! There are only a few ways to read properties in JavaScript.

The most common is probably the . operator.

How to avoid ‘cannot read property of undefined’ errors?

Imagine that we want to apply a series of functions to x if and only if x is non-null:

if (x !== null) x = a(x);
if (x !== null) x = b(x);
if (x !== null) x = c(x);

Now let’s say that we need to do the same to y:

if (y !== null) y = a(y);
if (y !== null) y = b(y);
if (y !== null) y = c(y);

And the same to z:

if (z !== null) z = a(z);
if (z !== null) z = b(z);
if (z !== null) z = c(z);

As you can see without a proper abstraction, we’ll end up duplicating code over and over again. Such an abstraction already exists: the Maybe monad.

The Maybe monad holds both a value and a computational context:

  1. The monad keeps the value safe and applies functions to it.
  2. The computational context is a null check before applying a function.

A naive implementation would look like this:

⚠️ This implementation is for illustration purpose only! This is not how it should be done and is wrong at many levels. However this should give you a better idea of what I am talking about.

As you can see nothing can break:

  1. We apply a series of functions to our value
  2. If at any point, the value becomes null (or undefined) we just don’t apply any function anymore.

Appendix 1

I cannot explain what monads are as this is not the purpose of this post and there are people out there better at this than I am. However as Eric Elliot said in hist blog post JavaScript Monads Made Simple:

Regardless of your skill level or understanding of category theory, using monads makes your code easier to work with. Failing to take advantage of monads may make your code harder to work with (e.g., callback hell, nested conditional branches, more verbosity).


Appendix 2

Here’s how I’d solve your issue using the Maybe monad from monetjs

How to find the error

First order of business is to figure out where the error is.

Читайте также:  Электронная подпись - НП "МосГорУслуга"

If you’re using Create React App, it probably threw up a screen like this:

Look for the file and the line number first.

Javascript – как исправить ‘cannot read property’, включающий ‘undefined’ в nodejs? [script ] –

Я настраиваю новый сервер и хочу запустить скрипт nodejs для разногласий. Но проблема в том, он сообщает об ошибках после запуска / или запуска скрипта.

Я попытался связаться с «автором» без ответа на GitHub, чтобы исправить это, и я попытался протестировать на других серверах, которые я в сети, но он говорит ту же ошибку. (включая понижение версии nodejs / npm.)

Код, который я нашел, взят со страницы GitHub: https://github.com/Triniayo/nodejs -discord – csgoupdate

// Requirements
const { Client } = require('discord.js');
const fs = require('fs');
const Parser = require('rss-parser');
const htmlToText = require('html-to-text');
const log = require('npmlog');

// Load Config
const cfg = require('./config.json');

// Create feeder instance
let rssParser = new Parser({
    // Renaming 'content:encoded' to 'contentHtml' because it won't be useable otherwise
    customFields: {
        item: [
            ['content:encoded', 'contentHtml']
        ]
    },
    // Setting User Agent
    headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
    }
});

// Setting variables for the RSS output
let updateTitle;
let updateURL;
let updateContent;
let updateDate;

// Setting last update variable
let lastUpdate;

function getLastUpdate() {
    // Getting date of last update from check-update.txt file
    let dateFromFile = fs.readFileSync('check-update.txt');
    lastUpdate = dateFromFile.toString();
}

// Getting last date from check-update.txt file every 5 seconds
setInterval(getLastUpdate, 5000);

// Create Discord Bot Instance
const bot = new Client();

// Logging into Bot Account
bot.on('ready', () => {
    log.info('discord', `Logged in as ${bot.user.tag} (User ID: ${bot.user.id}) on ${bot.guilds.size} server(s)`);
    bot.user.setActivity('Fetching Updates');

    // Checking every 10 seconds if there's a new update, and if it's been posted already
    setInterval(getUpdate, 10000);
});

function getUpdate() {
    // Get current date and edit format
    let getDate = new Date();
    let date = [
        getDate.getFullYear(),
        ('0'   (getDate.getMonth()   1)).slice(-2),
        ('0'   getDate.getDate()).slice(-2)
    ].join('-');

    // Fetching updates from CS:GO Blog
    (async () => {
        // Setting RSS Feed URL
        let feed = await rssParser.parseURL('http://blog.counter-strike.net/index.php/category/updates/feed/');

        // Setting items into variables
        feed.items.forEach(item => {
            if (item.isoDate.includes(`${date}`)) {
                updateTitle = item.title;
                updateURL = item.link;
                updateContent = item.contentHtml;
                updateDate = item.isoDate;
            }
        });

        // Converting from HTML to readable text
        let format = htmlToText.fromString(updateContent, {
            wordwrap: 130
        });

        // Limiting the update to 10 lines
        let updateNotes = format.split('n', 10);

        if (updateDate.includes(`${date}`)) {
            if (lastUpdate !== date) {
                bot.channels.get(cfg.channelid).send("@everyone A new CS:GO Update has been released!", {
                    embed: {
                      "title": `${updateTitle}`,
                      "description": `${updateNotes.join('n')}...nn[Continue reading on the CS:GO Blog](${updateURL})`,
                      "url": `${updateURL}`,
                      "color": 5478908,
                      "thumbnail": {
                        "url": "https://raw.githubusercontent.com/Triniayo/nodejs-discord-csgoupdate/master/csgo-icon.png"
                      }
                    }
                });

                // Storing date of the latest update in the check-update.txt
                fs.writeFileSync('check-update.txt', `${date}`)
            }
        } else {
            // Do nothing if update has been posted already.
        }
    })();
}

// Logging into the Bot Account
bot.login(cfg.token);

Ниже приведена ошибка, которую я получаю после того, как обновил nodejs & npm до последней версии.

(node:23692) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'includes' of undefined
    at /home/mikkel/bots/csgo/app.js:87:24
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:189:7)
(node:23692) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 13)

Я не знаю, что эта ошибка означает, так как я noob to nodejs.

Читайте также:  reactjs - × TypeError: Cannot read properties of undefined (reading 'map') - Stack Overflow

Версия, npm / узел:

node: v8.16.1
npm: 6.12.0

Что я должен был изменить? У меня нет смысла javascript или nodejs. скрипт свободно лежит на GitHub.

Обновление: отредактировано 10.10.2009 – 15:28 . Что с форматом даты? – Пример; на github читаем из check-update.txt в следующем формате: 23.10.2008 (например)

Кажется, это не публикуется для меня на Discord. (что он должен делать, если он этого не делает)

Примере:

    // Checking every 10 seconds if there's a new update, and if it's been posted already
    setInterval(getUpdate, 10000);

Вот в чем проблема:

            // Do nothing if update has been posted already.
        }
    })();
}

Может мне стоит создать нового бота из разногласий разработчиков?

Выложенная вами ошибка гласит следующее:

(node:23692) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'includes' of undefined
    at /home/mikkel/bots/csgo/app.js:87:24
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:189:7)

В первой строке сообщения об ошибке говорится, что он пытается вызвать includes или получить свойство includes объекта, но этот объект не определен. Вторая строка сообщения об ошибке сообщает вам, где возникает проблема; строка 87 (и столбец 24).

Строка 87 гласит:

if (updateDate.includes(`${date}`)) {

Таким образом, объект updateDate должен быть как-то не определен. Просматривая, мы видим, что он установлен только в цикле forEach в строке 70, но в операторе if внутри этого цикла.

feed.items.forEach(item => {
    if (item.isoDate.includes(`${date}`)) {
        updateTitle = item.title;
        updateURL = item.link;
        updateContent = item.contentHtml;
        updateDate = item.isoDate;
    }
});

Если цикл никогда не запускается, то updateDate никогда не будет установлен. Если каждый элемент в цикле не содержит дату в свойстве isoDate, то updateDate никогда не будет установлен.

Поэтому мы должны остерегаться этих случаев.

Мы можем добавить условие, что updateDate был установлен на что-то, изменив строку 87 на это:

if (updateDate && updateDate.includes(`${date}`)) {

The quick fix

This error usually means you’re trying to use .map on an array, but that array isn’t defined yet.

That’s often because the array is a piece of undefined state or an undefined prop.

Make sure to initialize the state properly. That means if it will eventually be an array, use useState([]) instead of something like useState() or useState(null).

Let’s look at how we can interpret an error message and track down where it happened and why.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector