有什么方法可以在trapi中使用媒体字段创建条目?

时间:2019-10-24 19:11:39

标签: javascript strapi

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

我想在单个请求中创建一个条目。有可能吗?

1 个答案:

答案 0 :(得分:1)

必须在服务文件上对 Strapi 进行两个单独的函数调用 - 一个用于创建条目,另一个用于上传文件并将文件链接到条目。


但是,有可能解决您的问题。

这里需要理解两个特别重要的 Strapi 概念:controllerservice

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

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

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

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


This is the default implementationcontroller 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,并且不会创建任何悬空数据。