节点:无法通过 API 解析 JSON

我从文件中加载 JSON 作为字符串,尝试将其解析回 JSON 并作为响应发送:


router.get('/todos', (req,res) =>{

    let todos = fs.readFile('todos.json', 'utf8',(err, data) =>{

        if (err) throw err


        res.send(JSON.parse(todos)) 

    })

})

我的 todos.json 文件:


{

    "todos": [

        {

            "id": 1,

            "text": "task number 1",

            "priority": 3,

            "done": false

        },

        {

            "id": 2,

            "text": "task number 2",

            "priority": 3,

            "done": false

        },

        {

            "id": 3,

            "text": "task number 3",

            "priority": 3,

            "done": false

        },

        {

            "id": 4,

            "text": "task number 4",

            "priority": 3,

            "done": false

        },

        {

            "id": 5,

            "text": "task number 5",

            "priority": 3,

            "done": false

        }

    ]

}

但是我收到此错误:


未定义 ^


SyntaxError:在 fs.readFile (/Users/mgonline/Desktop/programs/assessment/node-todo/routes/api/v1/todo.js:11:17) 的 JSON.parse () 位置 0 处的 JSON 中的意外标记 u在 FSReqWrap.readFileAfterClose [as oncomplete] (internal/fs/read_file_context.js:53:3)


我不知道为什么,但是当我 console.log 从文件中获取这个字符串时,我的程序似乎通过在集合数组中的最后一个对象之后添加一个逗号来稍微改变它:


{

    "id": 5,

    "text": "task number 5",

    "priority": 3,

    "done": false

},

据说这会引起这个错误。我应该以不同的方式重写我的 JSON 以避免冲突吗?


汪汪一只猫
浏览 122回答 3
3回答

喵喵时光机

问题您使用fs.readFile不正确。 fs.readFile将返回undefined,因为readFile是异步的。文件的内容实际上是在data您提供的回调参数中到达的。修理完全删除let todos =并调用fs.readFile(因为您不需要 的返回值fs.readFile)。然后调用JSON.parse(data)而不是JSON.parse(todos)(因为那是文件内容到达的地方)。前router.get('/todos', (req,res) =>{    let todos = fs.readFile('todos.json', 'utf8',(err, data) =>{        if (err) throw err        res.send(JSON.parse(todos))     })})后router.get('/todos', (req,res) =>{    fs.readFile('todos.json', 'utf8',(err, data) =>{        if (err) throw err        res.send(JSON.parse(data))     })})

猛跑小猪

我猜,编辑器在保存时会自动添加逗号。尝试将IDE的设置更改为在保存json文件时从数组元素中删除逗号

慕容森

您尚未todos在应用程序中定义,它未定义,因此您收到错误消息,正如@Sebastian Kaczmarek 所纠正的那样,todos返回值是fs.readFile. 作为fs.readFile回报"undefined",你会得到错误。使用datawhich 是脚本中包含required文件内容的参数的名称。router.get('/todos', (req, res) => {  fs.readFile('todos.json', 'utf8', (err, data) => {    if (err) throw err    res.send(JSON.parse(data));  })})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript