ValidationError при публикации JSON

У меня есть эта схема для авторов:

module.exports = {
  "id": "Author",
  "properties": {
    "name": {
      "type": "string",
      "description": "The full name of the author"
    },
    "description": {
      "type": "string",
      "description": "A small bio of the author"
    },
    "books": {
      "type": "array",
      "description": "The list of books published on at least one of the stores by this author",
      "items": {
        "$ref": "Book"
      }
    },
    "website": {
      "type": "string",
      "description": "The website url of the author"
    },
    "avatar": {
      "type": "string",
      "description": "The url of the avatar of this author"
    }
  }
}

Когда я отправляю сообщение на http://localhost:9000/authors/ для создания нового автора, я получаю эту ошибку :

ошибка: обнаружена ошибка типа InternalServerError: ValidationError: books: приведение к массиву не удалось для значения "['The Twits', 'BFG']" по пути "books"

Это JSON, который я публикую

{
    "name": "Roald Dahl",
    "description": "Writes childrens novels",
    "books": [
        "The Twits",
        "The BFG"
    ],
    "website": "www.roalddahl.com",
    "avatar": "https://www.natgeokids.com/wp-content/uploads/2016/11/Roald-Dahl-1-1.jpg"
}

Насколько мне известно, этот JSON верен. Ошибка, кажется, предполагает наличие проблемы с массивом books. Так ли это и если да, то как это исправить?

Добавление схемы книги:

module.exports = {
  "id": "Book",
  "properties": {
    "title": {
      "type": "string",
      "descrtiption": "The title of the book"
    },
    "authors": {
      "type": "array",
      "description": "List of authors of the book",
      "items": {
        "$ref": "Author"
      }
    },
    "isbn_code": {
      "type": "string",
      "description": "The stores where clients can buy this book"
    },
    "stores": {
      "type": "array",
      "description": "The stores where clients can buy this book",
      "items": {
        "type": "object",
        "properties": {
          "store": {
            "$ref": "Store"
          },
          "copies": {
            "type": "integer"
          }
        }
      }
    },
    "genre": {
      "type": "string",
      "description": "Genre of the book",
    },
    "description": {
      "type": "string",
      "description": "Description of the book"
    },
    "reviews": {
      "type": "array",
      "items": {
        "$ref": "ClientReview"
      }
    },
    "price": {
      "type": "number",
      "minimum": 0,
      "description": "The price of this book"
    }
  }
}

person runnerpaul    schedule 19.08.2018    source источник
comment
Что означает "items": { "$ref": "Book" }? Я использую этот онлайн-инструмент для тестирования, и без него данные действительны!   -  person Saeed    schedule 19.08.2018
comment
$ref отлично подходит для схемы JSON; предполагая, что существует схема для объекта Book, тогда ссылка (используемая здесь OP) будет означать, что массив будет содержать объекты Book. Но в документе JSON OP использует строки, а не объекты книги.   -  person Ray Toal    schedule 19.08.2018
comment
Я добавил схему Book для видимости. Этот код взят из книги REST API Development With Node.js. Я изучаю это, поэтому есть несколько вещей, в которых я не уверен (например, $ref). Имея это в виду, мой JSON, вероятно, неправильно использует строку для книг. Предполагая, что он должен использовать объект книги, как бы я изменил свой JSON, чтобы использовать это? Нужно ли сначала добавлять книги?   -  person runnerpaul    schedule 19.08.2018


Ответы (1)


Вы публикуете JSON с полем books в виде массива строк, поэтому ваш объект валидатора должен указывать:

items: { type: "string" },
person Ray Toal    schedule 19.08.2018