Дезинфицирующее средство Strapi v4

#strapi

#страпи

Вопрос:

Прямо сейчас я опробую новую версию сообщества strapi v4 (4.0.0). У меня есть пользовательский контроллер, который запрашивает текущего пользователя и (в будущем) извлекает связанные объекты.

Когда я делал это с помощью strapi v3, я использовал встроенную sanititzeEntitiy вспомогательную функцию для удаления конфиденциальных полей из экземпляра пользователя. Однако в версии 4 эта функция, похоже, больше не существует, и я не могу понять, как этого добиться.

Есть ли кто-нибудь, кто может мне в этом помочь? Мой код до сих пор таков:

  module.exports = {  currentUser: async(ctx, next) =gt; {  let user = ctx.state.user;  // TODO: sanitize this  } }  

В v3 я просто сделал return sanitizeEntity(user); то, что дало бы желаемый эффект. Я просто не могу понять, как это сделать в версии 4, и я не могу найти ничего, связанного с этим, в документах.

Ответ №1:

В Strapi v4 это выглядит так, как будто оно заменено sanitizeOutput функцией. Он принимает сущность, но, похоже, ему тоже нужно передать контекст ( ctx ). Однако это нигде не описано в официальной документации.

Комментарии:

1. Мне трудно заставить это работать. Когда я пытаюсь вызвать sanitizeOutput следующим образом: sanitizeOutput(user, ctx) я получаю исключение: sanitizeOutput не определен. Я предполагаю, что мне придется как-то потребовать этого, но единственное, что я могу найти defaultSanitizeOutput , — это sanitize.дезинфицирующие средства, которые при использовании возвращают некоторый объект с объявлениями функций, с которыми я не знаю, что делать.

2. Я не понимаю, какова область применения this in await this.sanitizeOutput , но вы можете найти ее здесь и просмотреть документацию или файлы strapi о том, как ее правильно использовать.

3. Правда, это устарело. Однако, если я использую вывод дезинфекции следующим образом: const userSanitized = await sanitizeOutput(user, ctx); Очистка не работает, я все равно получаю хэшированный пароль пользователя в ответе. Как я могу это изменить / что я делаю не так?

Ответ №2:

Вам нужно использовать утилиту «очистка» из «@strapi/utils».

 const { sanitize } = require('@strapi/utils');  module.exports = createCoreController('api::payment.payment', ({ strapi }) =gt; ({  async create(ctx) {  const entity = await strapi.entityService.create('api::payment.payment', {  data: {  field1: 1,  field2: 2,  },  });  const sanitizedEntity = await sanitize.contentAPI.output(entity);   return { data: sanitizedEntity };  }, }));   

Комментарии:

1. Я попробовал это, но это ничего не меняет, поля пароля все еще не удалены из экземпляра пользователя.

2. Мои шаги были следующими: получить пользователя: let user = await.getService('user').fetch({id}); let userSanitized = await sanititze.contentApi.output(user); return userSanitized К сожалению, при этом все еще сохраняется поле пароля в экземпляре пользователя.

3. @derelektrischemoench В любом случае вам нужно передать схему внутри дезинфицирующего средства. Вы можете попробовать этот метод, но убедитесь, что вы передали схему в качестве первого параметра. Я не знаю, как это сделать со страпи. sanitize.sanitizers.sanitizePasswords(schema, entity)

4. Привет, Дмитрий, к сожалению, это тоже не работает. Я все еще получаю поля пароля от своего пользователя. Может быть, мне нужно что-то изменить в самой модели в бэкэнде или что-то еще?