Ошибка типа: невозможно прочитать свойство undefined Node.js - PullRequest
0 голосов
/ 29 января 2020

У меня есть функция для получения последней резервной версии сетевого узла. Для этой функции дан список узлов (пример значения: TEST GROUP WLAN / SW4912), затем для получения последней версии резервной копии необходимо сделать запрос на получение json, а URL должен быть похож на " http://localhost/node/version?node_full=TEST%20GROUP%20WLAN / SW4912 & format = json "Я пытаюсь заменить строку, и она работает, но когда скрипт пытается сделать запрос, мне возвращается, который не может прочитать свойство 'replace' из undefined.

Что происходит?

Ошибка стека:

TEST GROUP WLAN/SW4912
1: TEST GROUP WLAN/SW4912
2: TEST%20GROUP%20WLAN/SW4912
http://localhost/node/version?node_full=TEST%20GROUP%20WLAN/SW4912&format=json
1: undefined
/tmp/relatorio/relatorio.js:28
        string = string.toString().replace(/\s/gi, "%20");
                        ^

TypeError: Cannot read property 'toString' of undefined
    at getLastVersion (/tmp/relatorio/relatorio.js:28:18)
    at Request._callback (/tmp/relatorio/relatorio.js:43:18)
    at Request.self.callback (/tmp/relatorio/node_modules/request/request.js:185:22)
    at Request.emit (events.js:223:5)
    at Request.<anonymous> (/tmp/relatorio/node_modules/request/request.js:1161:10)
    at Request.emit (events.js:223:5)
    at IncomingMessage.<anonymous> (/tmp/relatorio/node_modules/request/request.js:1083:12)
    at Object.onceWrapper (events.js:312:28)
    at IncomingMessage.emit (events.js:228:7)
    at endReadableNT (_stream_readable.js:1185:12)

Это мой код (Использование nodejs):

const Request = require('request');

const url = 'http://localhost/nodes?format=json';

Request.get({
        url: url,
        json: true,
        headers: {'User-Agent': 'request'}
}, (err, res, data) => {
        if (err) {
                console.log('Error:', err);
        } else if (res.statusCode !== 200) {
                console.log('Status:', res.statusCode);
        } else {
                getLastVersion(data);
        }
});

function getLastVersion(data){
        var string = data[0].full_name;

        //string = string.replace(/\s/g, "%20");
        console.log("1: "+string);
        string = string.toString().replace(/\s/gi, "%20");
        console.log("2: "+string);

        var url = `http://localhost/node/version?node_full=${string}&format=json`;
        console.log(url); // until here the function works!

        Request.get({
                url: url,
                json: true,
                headers: {'User-Agent': 'request'}
        }, (err, res, data) => {
                if (err) {
                        console.log('Error:', err);
                } else if (res.statusCode !== 200) {
                        console.log('Status:', res.statusCode);
                } else {
                        //console.log(data);
                        getLastVersion(data)
                }
        });

}

Спасибо за помощь!

1 Ответ

0 голосов
/ 29 января 2020

Ваш объект в позиции 0 вашего массива data может быть определен, но у него нет швов, чтобы иметь какое-либо свойство full_name. Это приведет к тому, что ваша переменная string будет неопределенной. Вы можете напечатать его в своем console.log (что приводит к слову undefined), но вы не можете выполнить с ним какие-либо действия (например, .toString(), что я не совсем уверен, что это строка function.).

Один из способов решить эту проблему - проверить, содержит ли объект свойство string перед его назначением. Есть несколько способов добиться этого, здесь мы используем hasOwnProperty для объекта.

function getLastVersion(data){
        if(data[0].hasOwnProperty('full_name')) {
            // full_name exists
            var string = data[0].full_name;

            console.log("1: "+string);
            string = string.toString().replace(/\s/gi, "%20");
            console.log("2: "+string);
            /* ... */
        } else {
           // full_name did not exist.
        }
}

Вы также можете назначить значение по умолчанию.

function getLastVersion(data){
            // full_name exists
            var string = data[0].full_name;


            if(typeof string === 'undefined' || string === null) {
               string = "some new name";
            }

            console.log("1: "+string);
            string = string.toString().replace(/\s/gi, "%20");
            console.log("2: "+string);
            /* ... */
}
...