#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
inawait 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. Привет, Дмитрий, к сожалению, это тоже не работает. Я все еще получаю поля пароля от своего пользователя. Может быть, мне нужно что-то изменить в самой модели в бэкэнде или что-то еще?