删除分号时,Nodejs表示API 500内部服务器错误;

时间:2018-05-17 06:52:36

标签: node.js express

我没有习惯在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});
        }
    })
})

但如果我在第二行之后添加分号;,则此代码正常运行。此处的回复显示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 :(得分:5)

您遇到了自动分号插入的问题之一,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});
        }
    })
})

添加分号时,可以消除歧义并导致第二个数组文字被解析为数组文字,而不是属性访问器。

答案 1 :(得分:2)

如果错过‘;’,您的代码将如下所示:

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

它将从空数组[]访问元素,此代码等于以下内容:

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

显然,空数组的第10个索引是未定义的,因此您将获得TypeError: Cannot read property 'map' of undefined

更新

以下是有关此主题的帖子:

Why I Prefer To Use Semicolon In JavaScript

An Open Letter to JavaScript Leaders Regarding No Semicolons