Strapi & реагировать-администратор: я хотел бы динамически установить заголовок «Content-Range», когда любой запрос fetchAll запускается - PullRequest
0 голосов
/ 19 сентября 2019

Я все еще начинающий веб-разработчик, поэтому, пожалуйста, потерпите меня, если мне не хватает чего-то фундаментального!

Я создаю бэк-офис для Strapi бэкэнда, используя response-admin .

Библиотека React-admin использует «провайдера данных» для связи с API. К счастью, кто-то уже написал провайдер данных для Strapi .У меня не было проблем с шагами 1 и 2 этого README, и я могу проходить аутентификацию в Strapi в своем приложении React.

Теперь я хочу получить и отобразить свои данные Strapi , начиная с Users,Чтобы сделать это, процитируем шаг 3 этого файла readme: «В контроллерах мне нужно установить заголовок Content-Range с общим количеством результатов для построения нумерации страниц».

ИтакДо сих пор я пытался сделать это в своем контроллере пользователя, но безуспешно.

Чего я пытаюсь достичь:

  • Во-первых, я бы хотел, чтобы он просто работал сctx.set('Content-Range', ...) жестко запрограммирован в контроллере, как указано выше в шаге 3.

  • Во-вторых, я думал, что было бы очень грязно использовать эту логику в каждом контроллере (неупоминание в любых будущих контроллерах), вместо того, чтобы иметь некоторую функцию обратного вызова, динамически добавляющую заголовок Content-Range к любому запросу fetchAll.В конечном счете, это то, к чему я стремлюсь, потому что с ~ 40 объектами Strapi, которые нужно администрировать, и с большим количеством других возможностей, оно должно масштабироваться.

Техническая информация

node -v: 11.13.0

npm -v: 6.7.0

strapi version: 3.0.0-alpha.25.2

uname -r вывод: Linux 4.14.106-97.85.amzn2.x86_64

БД: mySQL v2.16


До сих пор я пытался получить доступ к методу count () модели User, как вышеупомянутый шаг 3, но мой контроллер этого не делаетЭто не похоже на пример, так как я работаю с плагином user-permissions.

Это действие, которое я пытался отредактировать (находится в project / plugins / users-permissions / controllers / User.js)

  find: async (ctx) => {
    let data = await strapi.plugins['users-permissions'].services.user.fetchAll(ctx.query);
    data.reduce((acc, user) => {
      acc.push(_.omit(user.toJSON ? user.toJSON() : user, ['password', 'resetPasswordToken']));
      return acc;
    }, []);

    // Send 200 `ok`
    ctx.send(data);
  },

Из того, что я собрал в документации Strapi ( здесь , а также здесь ), контекст является своего рода объектом-оболочкой.Раньше я работал только с API-интерфейсами, сгенерированными Express, поэтому я понимал этот фрагмент как , использующий метод fetchAll объекта модели User с аргументом ctx.query , , но мне не повезлоэто ctx.query.И так как я не могу войти в систему, я вроде как заблокирован.

В своем исследовании я наивно пытался зарегистрировать полный объект ctx и работать оттуда:

    // Send 200 `ok`
    ctx.send(data);
    strapi.log.info(ctx.query, ' were query');
    strapi.log.info(ctx.request, 'were request');
    strapi.log.info(ctx.response, 'were response');
    strapi.log.info(ctx.res, 'were res');
    strapi.log.info(ctx.req, 'were req');
    strapi.log.info(ctx, 'is full context')
  },

К сожалению, я боюсь упустить что-то очевидное, так какне дает мне никакой информации вообще.Делая запрос fetchAll из моего приложения React с этими console.logs, напечатайте это в моем терминале:

[2019-09-19T12:43:03.409Z] info  were query
[2019-09-19T12:43:03.410Z] info were request
[2019-09-19T12:43:03.418Z] info were response
[2019-09-19T12:43:03.419Z] info were res
[2019-09-19T12:43:03.419Z] info were req
[2019-09-19T12:43:03.419Z] info is full context
[2019-09-19T12:43:03.435Z] debug GET /users?_sort=id:DESC&_start=0&_limit=10& (74 ms)

В то время как в моем интерфейсе я получаю хороший старый Заголовок Content-Rangeотсутствует в сообщении HTTP Response , которое я пытаюсь решить.

После написания этой стены текста я понимаю, что проблема с журналированием отделена от моей первоначальной проблемы, но если я смог хотя бы зарегистрировать ctxправильно, может быть, я смогу найти решение сам.

Пытаясь подвести итог:

  • Фактическая проблема заключается в том, как правильно настроить диапазон содержимого вмой контроллер strapi? (частично ответил, см. редактировать 3)
  • Сопутствующая проблема № 1: Не удается даже записать объект CTX ( ср. редактировать 2 )
  • Сопутствующая проблема № 2: Как только я выясню реальную проблему, возможно ли ее динамическое решение (в основном некоторая функция обратного вызова для маршрутов index / fetchAll, в которой модель является переменной, для которойЯ бы назвал соответствующий count() метod, и, наконец, добавить результат в заголовок моего ответа)?Я не прошу код здесь, просто если вы думаете, что это возможно и / или знаете более элегантный способ.

Спасибо, что прочитали, и извините, если это не так;Я не был уверен, какая информация будет уместна, поэтому подумал: чем больше, тем лучше.

/ edit1 : забыл упомянуть, в моем контроллере я также пытался зарегистрировать объект strapi.plugins['users-permissions'].services.user, чтобы увидеть, есть ли у него метод count (), но мне тоже не повезло.Также попробовал оригинальный фрагмент (Шаг 3 вышеупомянутого README), но потерпел неудачу, как и ожидалось, как afaik. Я не вижу нигде импортируемой модели User (единственный импорт в User.js - lodash)

/ edit2: Насчет логов, мой плохой, я просто неправильно понял документацию.Теперь я делаю:

    ctx.send(data);
    strapi.log.info('ctx should be : ', {ctx});
    strapi.log.info('ctx.req = ', {...ctx.req});
    strapi.log.info('ctx.res = ', {...ctx.res});
    strapi.log.info('ctx.request = ', {...ctx.request});
    ctrapi.log.info('ctx.response = ', {...ctx.response});

Ctx логи таким образом;также кажется, что ему нужен оператор распространения для отображения вложенных объектов ({ctx.req} сбой сервера, {... ctx.req} все в порядке).Круто, потому что это сужает вопрос к тому, что интересно.

/ edit3 : Как и следовало ожидать, наличие журналов помогает большое время.Мне удалось отобразить моих пользователей (хотя и грязным способом).Не удалось найти какой-либо метод count (), но просмотр объекта data, который передается в ctx.send(), эквивалентен вашему типичному «res.data», то есть чистому JSON с моим списком пользователей.Таким образом, простая .length добилась цели:

    let data = await strapi.plugins['users-permissions'].services.user.fetchAll(ctx.query);
    data.reduce((acc, user) => {
      acc.push(_.omit(user.toJSON ? user.toJSON() : user, ['password', 'resetPasswordToken']));
      return acc;
    }, []);
    ctx.set('Content-Range', data.length) // <-- it did the trick
    // Send 200 `ok`
    ctx.send(data);

Теперь начинаем работать над сложной частью: динамическая функция обратного вызова, которая сделает это для любого вызова index / fetchAll.Буду обновлять как только разберусь

...