如何使用contentful-management单次API调用为entry添加asset并解决409版本不匹配报错
409 Version Mismatch 报错根因
Contentful 上所有资源(Entry、Asset)都自带sys.version版本号标识,每执行一次更新/发布操作,版本号会自动+1。如果你使用本地保存的旧版本资源对象发起修改请求,就会触发版本不匹配的409报错。
现有代码的问题点
- 创建Entry后调用
entry.publish()没有等待异步执行完成,后续拿到的entry对象还是发布前的旧版本 - 给Entry关联Asset后重复调用了两次
entry.update(),第二次调用使用的是未更新版本的旧entry对象 - Promise 嵌套层级过多,没有正确接收异步操作返回的新版本资源对象
修正后的完整流程
- 按space id获取空间
- 获取master环境
- 创建Entry,发布后接收返回的新版本Entry对象
- 创建Asset,等待Asset所有locale处理完成后发布,接收返回的已发布Asset对象
- 用最新的Entry对象关联Asset,执行更新操作
- 发布更新后的Entry
修正后代码示例
import { createClient } from 'contentful-management' import faker from 'faker' const postProperty = async (data: Partial<Property>, uploadHref: string) => { const SPACE_ID = process.env.NEXT_CONTENTFUL_SPACE_ID; const client = createClient({ accessToken: process.env.NEXT_CONTENTFUL_PERSONAL_ACCESS_TOKEN as string, }); try { // 1. 获取空间、环境 const space = await client.getSpace(SPACE_ID) const environment = await space.getEnvironment("master") // 2. 创建并发布Entry let entry = await environment.createEntry("propertyListings", { fields: { id: { "en-US": faker.datatype.number(4) + "-" + data.streetAddress, }, firstName: { "en-US": data.firstName, }, lastName: { "en-US": data.lastName, }, email: { "en-US": data.email, }, phone: { "en-US": data.phone, }, price: { "en-US": data.price, }, streetAddress: { "en-US": data.streetAddress, }, city: { "en-US": data.city, }, state: { "en-US": data.state, }, zipcode: { "en-US": data.zipcode, }, latitude: { "en-US": Number(data.latitude as number), }, longitude: { "en-US": Number(data.longitude as number), }, bedrooms: { "en-US": data.bedrooms, }, bathrooms: { "en-US": data.bathrooms, }, sqft: { "en-US": Number(data.sqft), }, carSpaces: { "en-US": data.carSpaces, }, type: { "en-US": data.type, }, datePosted: { "en-US": data.datePosted, }, petFriendly: { "en-US": data.petFriendly, }, images: { "en-US": [], }, }, }) // 接收发布后返回的新版本entry对象 entry = await entry.publish() // 3. 创建并发布Asset let asset = await environment.createAssetWithId(faker.datatype.number(4).toString(), { fields: { title: { "en-US": data.streetAddress, }, file: { "en-US": { contentType: "image/jpeg", fileName: data.streetAddress + ".jpeg", upload: uploadHref, }, }, }, }) // 等待Asset所有locale处理完成 asset = await asset.processForAllLocales() // 接收发布后返回的新版本asset对象 asset = await asset.publish() // 4. 关联Asset到Entry,更新并发布 entry.fields["images"]["en-US"] = { sys: { id: asset.sys.id, linkType: "Asset", type: "Link" }, }; // 接收更新后的新版本entry对象 entry = await entry.update() // 发布最终版本Entry entry = await entry.publish() console.log('操作完成,Entry信息:', entry) } catch (err) { console.log("报错信息:", err) } };
内容的提问来源于stack exchange,提问作者Kayceecodes
相关产品推荐
相关产品推荐

