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

У меня есть простая CMS с Strapi с типом контента сообщение. Этот документ (тип содержимого) имеет такие поля, как заголовок, дополнительный заголовок, выдержка, текст и т. Д. Теперь я хотите иметь возможность записывать количество просмотров для каждой записи в этом документе.

Итак, я добавил к нему числовое поле под названием views со значением 0 по умолчанию. Следуя инструкциям в документации Strapi, я добавил следующий код в свою модель api (на /api/post/models/Post.js):

beforeFetchAll: async (model) => {
  model.views += 1;
},

Я понимаю, что любой фрагмент внутри метода beforeFetch должен запускаться и выполняться перед любой fetch операцией, что и делает запрос post в GraphQL. Однако, несмотря на несколько выборок, значение в этом поле остается неизменным. Любой разработчик Strapi, который мог бы понять, в чем я ошибаюсь? Полный код можно найти по адресу https://github.com/amitschandillia/proost/blob/master/dev/api/post/models/Post.js.

PS: запрос, который я пытаюсь выполнить в GraphQL Playground по адресу https://dev.schandillia.com/graphql:

{
  posts(limit: 1, where: {slug: "one-post"}) {
    id
    title
    views
  }
}

person TheLearner    schedule 28.11.2019    source источник


Ответы (1)


Для этого я предлагаю вам понять эту концепцию https://strapi.io/documentation/developer-docs/latest/development/backend-customization.html#backend-customization.

Затем вам нужно будет настроить функцию контроллера findOne Post API.

Здесь вы найдете функцию udpate по умолчанию. https://strapi.io/documentation/developer-docs/latest/development/backend-customization.html#controllers

Вот как это должно выглядеть:

Путь - ./api/post/controller/Post.js

  async findOne(ctx) {
    const entity = await strapi.services.post.findOne(ctx.params);

    const sanitized = sanitizeEntity(entity, { model: strapi.models.post });

    const newView = sanitized.views + 1;
    strapi.query('post').update({ id: sanitized.id }, {
      views: newView
    });

    return sanitized;
  },

Вот короткое видео, которое поможет https://www.loom.com/share/df0cb65c52b0478d994403732fac

person Jim LAURIE    schedule 28.11.2019