如何使用 contentful-management 在一次 api 调用中将资产添加到条目中?

jus*_*arr 0 contentful contentful-management next.js contentful-api headless-cms

我想添加一个资产和一个条目。我正在使用表单输入一些数据并上传图像,所有这些都在一个 API 调用中完成。我使用 cloudinary 来存储图像,但 Contentful-Management 给了我 409 状态代码和“版本不匹配”错误。

这些是我在下面采取的步骤(如果您看到我忽略的步骤,请添加任何步骤,非常感谢)

#1. Get space by space id
#2. Get environment
#3. Create Entry
#4. Create a new asset
#5. Assign uploaded image as an entry field
Run Code Online (Sandbox Code Playgroud)

data ”是我发布帖子所需的所有数据,uploadHref 是来自 Cloudinary 的单个图像的链接。

#1. Get space by space id
#2. Get environment
#3. Create Entry
#4. Create a new asset
#5. Assign uploaded image as an entry field
Run Code Online (Sandbox Code Playgroud)

ste*_*dis 6

内容丰富的 DevRel 在这里。

如果您遇到VersionMisMatch大多数情况,则说明您在创建或更新后不会重新分配资源。Contentful 的 API 使用新的条目版本响应每个写入操作,这样就可以防止覆盖较新的数据。

我重写了您的示例(未经测试),以使用 API 的结果重新分配返回的对象entry和对象。asset

async function createEntryWithAsset() {
    const space = await client.getSpace(SPACE_ID);
    const environment = await space.getEnvironment("master");
    
    /**
     * Entry creation and publish
     */
    let entry = await environment.createEntry("propertyListings", {
        /* ... */
    });
    // reassign `entry` to have the latest version number
    entry = await entry.publish();
    
    /**
     * Asset creation and publish
     */
    let asset = await environment.createAssetWithId(
        faker.datatype.number(4).toString(),
        {
          /* ... */
        }
    );
    // reassign `asset` to have the latest version number
    asset = await asset.processForAllLocales();
    asset = await asset.publish();
    
    /**
     * Update entry with new asset
     */
    entry.fields["images"]["en-US"] = {
        sys: {
          id: asset.sys.id,
          linkType: "Asset",
          type: "Link",
        },
    };
    entry = await entry.update();
    entry = await entry.publish();
}
    
createEntryWithAsset();
Run Code Online (Sandbox Code Playgroud)