我正在尝试在 Strapi 中创建一个条目,其中包含媒体类型的字段。
现在我正在使用文档中提供的代码。但实际上,它正在创建一个条目,然后向其中添加文件。所以媒体字段不能设为必填。
async create(data, { files } = {}) {
const entry = await strapi.query(model).create(data);
if (files) {
await this.uploadFiles(entry, files, { model });
return this.findOne({ id: entry.id });
}
return entry;
}
Run Code Online (Sandbox Code Playgroud)
我想在单个请求中创建一个条目。是否可以?
小智 1
必须对服务文件 \xe2\x80\x93 上的 Strapi 进行两个单独的函数调用,一个用于创建条目,一个用于上传文件并将文件链接到条目。
\n但是,可以解决您的问题。
\n这里需要理解两个特别重要的 Strapi 概念:控制器和服务。
\n单击链接可阅读官方文档,但这里有一个快速概述。
\n两者都有默认实现,默认控制器实现调用相应的默认服务实现。
\n您展示的是服务的默认实现。但在这种情况下定制控制器更有意义。
\n这是默认实现controller create:
const { parseMultipartData, sanitizeEntity } = require(\'strapi-utils\');\n\nmodule.exports = {\n /**\n * Create a record.\n *\n * @return {Object}\n */\n\n async create(ctx) {\n let entity;\n if (ctx.is(\'multipart\')) {\n const { data, files } = parseMultipartData(ctx);\n // *** Notice here it is calling the service function ...\n entity = await strapi.services.restaurant.create(data, { files });\n } else {\n // *** ... or here.\n entity = await strapi.services.restaurant.create(ctx.request.body);\n }\n return sanitizeEntity(entity, { model: strapi.models.restaurant });\n },\n};\nRun Code Online (Sandbox Code Playgroud)\n要使媒体字段成为强制字段,请覆盖默认实现以拒绝任何没有文件的请求。例如:
\n// ...\n\n async create(ctx) {\n ctx.assert(ctx.is(\'multipart\'), 400, \'Hey! You need to add a file!\');\n\n const { data, files } = parseMultipartData(ctx);\n let entity = await strapi.services.restaurant.create(data, { files });\n \n return sanitizeEntity(entity, { model: strapi.models.restaurant });\n }\n\n\n// ...\nRun Code Online (Sandbox Code Playgroud)\n现在,任何没有文件的请求都将收到 400,并且不会创建悬空数据。
\n| 归档时间: |
|
| 查看次数: |
1893 次 |
| 最近记录: |