Strappy vch sanitizeentiti
Strapi v4 sanitizeEntity
我正在试用新的 strapi v4 (4.0.0) 社区版。我有一个自定义控制器,它查询当前用户并(将来)获取相关对象。
当我使用 strapi v3 执行此操作时,我使用内置的 sanititzeEntitiy
- 辅助函数从用户实例中删除敏感字段。然而在 v4 中,这个功能似乎不再存在,我不知道如何实现它。
有没有人可以帮我解决这个问题?到目前为止我的代码是:
module.exports = {
currentUser: async(ctx, next) => {
let user = ctx.state.user;
// TODO: sanitize this
}
}
在 v3 中,我只是做了 return sanitizeEntity(user);
,这会产生预期的效果。我只是不知道如何在 v4 中执行此操作,而且我在文档中找不到任何相关内容。
在 Strapi v4 中,它似乎已被 sanitizeOutput
函数取代。它接受实体,但看起来它也需要传递上下文 (ctx
)。虽然官方文档中没有任何描述。
您需要使用“@strapi/utils”中的“清理”实用程序。
const { sanitize } = require('@strapi/utils');
module.exports = createCoreController('api::payment.payment', ({ strapi }) => ({
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 };
},
}));
一段时间后,strapi 社区论坛上的一个人 JustJerem 想出了一个解决方案;首先你必须安装 strapi-utils
:npm i -D strapi-utils
,然后在你的控制器中你必须这样做:
const { sanitizeEntity } = require('strapi-utils/lib');
currentUser: async (ctx, next) => {
const {id, isAdmin = false} = await strapi.plugins['users-permissions'].services.jwt.getToken(ctx);
const entity = await strapi.entityService.findOne('plugin::users-permissions.user', id); // or get the user differently, in this case I can't take it from context
let sanitizedEntity = sanitizeEntity(entity, { model: strapi.getModel('plugin::users-permissions.user') });
return sanitizedEntity;
}
仅此而已。
这是他原来的 post 的 link:
https://forum.strapi.io/t/v4-0-0-sanitize-user-data/13326
所以我在strapi社区论坛上同时发布了这个问题。一个名叫 JustJerem 的用户帮我回答了这个问题,看起来像这样:
**const { sanitizeEntity } = require("strapi-utils/lib");**
module.exports = (plugin) => {
plugin.controllers.user.deleteMe = async (ctx) => {
const entity = await strapi.entityService.delete('plugin::users-permissions.user', user.id)
var result = **sanitizeEntity(entity, { model: strapi.getModel('plugin::users-permissions.user') })**
return result
};
//...
};
strapi 论坛中的原始答案可以在这里找到:
https://forum.strapi.io/t/v4-0-0-sanitize-user-data/13326/4?u=derelektrischemoench
此解决方案的所有功劳都归功于 strapi 板上的 JustJerem。
这样做对我有用。希望这也能帮助到其他人。
您好,
derelektrischemoench
您可以定义一个 sanitizeOutput 函数并使用它(适用于 strapi 4):
const utils = require("@strapi/utils");
const {sanitize} = utils;
const sanitizeOutput = (data, ctx) => {
const schema = strapi.getModel('plugin::xxx.yyy');
const {auth} = ctx.state;
return sanitize.contentAPI.output(data, schema, {auth});
};
module.exports = {
async find(ctx) {
let entities = ... //retrieve entities
//call the function
ctx.body = await sanitizeOutput(entities, ctx);
},
};
我正在试用新的 strapi v4 (4.0.0) 社区版。我有一个自定义控制器,它查询当前用户并(将来)获取相关对象。
当我使用 strapi v3 执行此操作时,我使用内置的 sanititzeEntitiy
- 辅助函数从用户实例中删除敏感字段。然而在 v4 中,这个功能似乎不再存在,我不知道如何实现它。
有没有人可以帮我解决这个问题?到目前为止我的代码是:
module.exports = {
currentUser: async(ctx, next) => {
let user = ctx.state.user;
// TODO: sanitize this
}
}
在 v3 中,我只是做了 return sanitizeEntity(user);
,这会产生预期的效果。我只是不知道如何在 v4 中执行此操作,而且我在文档中找不到任何相关内容。
在 Strapi v4 中,它似乎已被 sanitizeOutput
函数取代。它接受实体,但看起来它也需要传递上下文 (ctx
)。虽然官方文档中没有任何描述。
您需要使用“@strapi/utils”中的“清理”实用程序。
const { sanitize } = require('@strapi/utils');
module.exports = createCoreController('api::payment.payment', ({ strapi }) => ({
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 };
},
}));
一段时间后,strapi 社区论坛上的一个人 JustJerem 想出了一个解决方案;首先你必须安装 strapi-utils
:npm i -D strapi-utils
,然后在你的控制器中你必须这样做:
const { sanitizeEntity } = require('strapi-utils/lib');
currentUser: async (ctx, next) => {
const {id, isAdmin = false} = await strapi.plugins['users-permissions'].services.jwt.getToken(ctx);
const entity = await strapi.entityService.findOne('plugin::users-permissions.user', id); // or get the user differently, in this case I can't take it from context
let sanitizedEntity = sanitizeEntity(entity, { model: strapi.getModel('plugin::users-permissions.user') });
return sanitizedEntity;
}
仅此而已。 这是他原来的 post 的 link: https://forum.strapi.io/t/v4-0-0-sanitize-user-data/13326
所以我在strapi社区论坛上同时发布了这个问题。一个名叫 JustJerem 的用户帮我回答了这个问题,看起来像这样:
**const { sanitizeEntity } = require("strapi-utils/lib");**
module.exports = (plugin) => {
plugin.controllers.user.deleteMe = async (ctx) => {
const entity = await strapi.entityService.delete('plugin::users-permissions.user', user.id)
var result = **sanitizeEntity(entity, { model: strapi.getModel('plugin::users-permissions.user') })**
return result
};
//...
};
strapi 论坛中的原始答案可以在这里找到:
https://forum.strapi.io/t/v4-0-0-sanitize-user-data/13326/4?u=derelektrischemoench
此解决方案的所有功劳都归功于 strapi 板上的 JustJerem。 这样做对我有用。希望这也能帮助到其他人。
您好, derelektrischemoench
您可以定义一个 sanitizeOutput 函数并使用它(适用于 strapi 4):
const utils = require("@strapi/utils");
const {sanitize} = utils;
const sanitizeOutput = (data, ctx) => {
const schema = strapi.getModel('plugin::xxx.yyy');
const {auth} = ctx.state;
return sanitize.contentAPI.output(data, schema, {auth});
};
module.exports = {
async find(ctx) {
let entities = ... //retrieve entities
//call the function
ctx.body = await sanitizeOutput(entities, ctx);
},
};