我正在尝试在Stradi中创建一个条目,其中包含media类型的字段。
现在,我正在使用文档中提供的代码。但是,实际上,它正在创建一个条目,然后向其中添加文件。因此无法必填。
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;
}
我想在单个请求中创建一个条目。有可能吗?
答案 0 :(得分:1)
必须在服务文件上对 Strapi 进行两个单独的函数调用 - 一个用于创建条目,另一个用于上传文件并将文件链接到条目。
但是,有可能解决您的问题。
这里需要理解两个特别重要的 Strapi 概念:controller 和 service。
点击链接阅读官方文档,但这里有一个快速概述。
两者都有默认实现,默认控制器实现调用对应的默认服务实现。
您展示的那个是服务的默认实现。但在这种情况下自定义控制器更有意义。
This is the default implementation 的 controller create
:
const { parseMultipartData, sanitizeEntity } = require('strapi-utils');
module.exports = {
/**
* Create a record.
*
* @return {Object}
*/
async create(ctx) {
let entity;
if (ctx.is('multipart')) {
const { data, files } = parseMultipartData(ctx);
// *** Notice here it is calling the service function ...
entity = await strapi.services.restaurant.create(data, { files });
} else {
// *** ... or here.
entity = await strapi.services.restaurant.create(ctx.request.body);
}
return sanitizeEntity(entity, { model: strapi.models.restaurant });
},
};
要强制使用媒体字段,请覆盖默认实现以拒绝任何没有文件的请求。例如:
// ...
async create(ctx) {
ctx.assert(ctx.is('multipart'), 400, 'Hey! You need to add a file!');
const { data, files } = parseMultipartData(ctx);
let entity = await strapi.services.restaurant.create(data, { files });
return sanitizeEntity(entity, { model: strapi.models.restaurant });
}
// ...
现在任何没有文件的请求都会收到 400,并且不会创建任何悬空数据。