有没有办法在 Strapi 中创建带有媒体字段的条目?

alx*_*nkt 5 javascript strapi

我正在尝试在 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

但是,可以解决您的问题。

\n

这里需要理解两个特别重要的 Strapi 概念:控制器服务

\n

单击链接可阅读官方文档,但这里有一个快速概述。

\n
    \n
  • 控制器负责处理每个 API 调用。
  • \n
  • 服务是一组实用功能。它们用于与数据库交互(除其他外)。
  • \n
\n

两者都有默认实现,默认控制器实现调用相应的默认服务实现。

\n

您展示的是服务的默认实现。但在这种情况下定制控制器更有意义。

\n
\n

这是默认实现controller create

\n
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};\n
Run 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// ...\n
Run Code Online (Sandbox Code Playgroud)\n

现在,任何没有文件的请求都将收到 400,并且不会创建悬空数据。

\n