SyntaxError: Unexpected end of JSON input in my model

SyntaxError: Unexpected end of JSON input in my model

我正在关注这个 tutorial

的第 4 部分

我的 package.json 有以下脚本来 运行 mocha 测试和 运行 节点服务器

  "scripts": {
    "test": "mocha -r esm ./test/* --exit",
    "start": "node -r esm app.js"
  },

但是,当我尝试 npm start 时,我得到以下信息

> backend@1.0.0 start /Users/lee33ya/Desktop/mern-app/backend
> node -r esm app.js

/Users/lee33ya/Desktop/mern-app/backend/lib/model.js:1
SyntaxError: Unexpected end of JSON input
    at JSON.parse (<anonymous>)
    at MessageApp.readFromJson (/Users/lee33ya/Desktop/mern-app/backend/lib/model.js:60:17)
    at new MessageApp (/Users/lee33ya/Desktop/mern-app/backend/lib/model.js:15:37)
    at Object.<anonymous> (/Users/lee33ya/Desktop/mern-app/backend/lib/controller.js:3:18)
    at Generator.next (<anonymous>)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! backend@1.0.0 start: `node -r esm app.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the backend@1.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/lee33ya/.npm/_logs/2020-11-21T05_13_35_510Z-debug.log

类似地,当我尝试 npm test 时,我在与 npm start

相同的文件中遇到类似的 SyntaxError: Unexpected end of JSON input 错误

主要问题似乎出在我在 backend/lib/model.js

中的 readFromJson() 函数中
function newId(array) {
  if (array.length > 0) {
    return array[array.length - 1].id + 1;
  } else {
    return 1;
  }
}

import fs from 'fs';
import path from 'path';

class MessageApp {
  constructor(filepath) {
    this.filepath = filepath;
    this.messages = filepath ? this.readFromJson() : [];
  }
  // C
  post(content) {
    if (content) {
      this.messages.push({
        content: content,
        date: new Date(),
        id: newId(this.messages),
      });
      this.writeToJson();
      return this.messages;
    } else if (!content) {
      return [];
    }
  }
  // R
  get(id) {
    return this.messages.filter((message) => message.id == id)[0];
  }
  getAll() {
    return this.messages;
  }
  update(id, update) {
    let index = this.messages.findIndex((message) => message.id == id);
    if (index >= 0) {
      this.messages[index].content = update;
      this.writeToJson();
      return this.messages;
    } else {
      return [];
    }
  }
  delete(id) {
    let index = this.messages.findIndex((message) => message.id === id);
    if (index >= 0) {
      this.messages = this.messages.filter((message) => message.id !== id);
      this.writeToJson();
      return this.messages;
    } else {
      return 'Message not found in database';
    }
  }

  readFromJson() {
    return JSON.parse(
      fs.readFileSync(
        __dirname + path.normalize(this.filepath),
        'utf8',
        (err, data) => {
          if (err) throw err;
        }
      )
    );
  }
  writeToJson() {
    if (this.filepath) {
      const jsonItem = JSON.stringify(this.messages);
      fs.writeFileSync(
        __dirname + path.normalize(this.filepath),
        jsonItem,
        (err) => {
          if (err) throw err;
        }
      );
    }
  }
}
export default MessageApp;

我不太明白我做错了什么,因为我是 nodejs 和 express 的初学者。我该如何解决这个 SyntaxError

我的github

查看 backend/lib/json 中的 Github 文件是:

["hello world"]

还有一个空文件。

当然,一个空文件没有格式化为 JSON 并且尝试反序列化将失败。
您可以检查 json docs 了解它是如何工作的,但作为概述 json 期望 { }[ ]:

{ }是定义对象。
[ ]是定义数组。

所以,如果你的文件是空的,它会抛出错误 Unexpected end of JSON input