Nodejs express API 500 внутренняя ошибка сервера при удалении точки с запятой; - PullRequest
0 голосов
/ 17 мая 2018

У меня нет привычки использовать точку с запятой ; в коде JavaScript. Это мой API, но это не работает. Здесь ответ, показывающий 500 Internal Server Error

router.post('/addRows', function (req, res) {
    const saveData = []
    [1,2,3,4,5,6,7,8,9,10].map((i) => {
        console.log(i)
        saveData.push(i)
        if (saveData.length === 10) {
            res.status(200).json({'data': saveData});
        }
    })
})

но если я добавлю точку с запятой ; после 2-й строки, то этот код работает. Здесь ответ, показывающий 200 OK

router.post('/addRows', function (req, res) {
    const saveData = [];
    [1,2,3,4,5,6,7,8,9,10].map((i) => {
        console.log(i)
        saveData.push(i)
        if (saveData.length === 10) {
            res.status(200).json({'data': saveData});
        }
    })
})

В чем проблема. Пожалуйста, опишите

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Если пропустить ‘;’, ваш код будет выглядеть так:

const saveData = [][1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(...)

это будет доступ к элементу из пустого массива [], этот код равен ниже:

const saveData = [][10].map(...)

очевидно, десятый индекс пустого массива не определен, поэтому вы получите TypeError: Cannot read property 'map' of undefined

Обновление:

Вот сообщения на эту тему:

Почему я предпочитаю использовать точку с запятой в JavaScript

Открытое письмо лидерам JavaScript об отсутствии точек с запятой

0 голосов
/ 17 мая 2018

У вас возникла одна из проблем с автоматической вставкой точек с запятой, функция JavaScript, которая позволяет использовать точки с запятой как «необязательные».

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

router.post('/addRows', function (req, res) {
    const saveData = [][1,2,3,4,5,6,7,8,9,10].map((i) => {
        console.log(i)
        saveData.push(i)
        if (saveData.length === 10) {
            res.status(200).json({'data': saveData});
        }
    })
})

Это может показаться неверным, но это так - второй литерал массива анализируется как поиск свойства, содержащий выражение с запятыми («группировка»). Оператор запятой возвращает свой последний операнд, поэтому вы можете упростить приведенное выше:

router.post('/addRows', function (req, res) {
    const saveData = [][10].map((i) => {
        console.log(i)
        saveData.push(i)
        if (saveData.length === 10) {
            res.status(200).json({'data': saveData});
        }
    })
})

Когда вы добавляете точку с запятой, вы удаляете неоднозначность и заставляете второй литерал массива анализироваться как литерал массива, а не как средство доступа к свойству.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...