Contentful 内容管理 API 创建资产时出现错误 422
Contentful Content Management API Error 422 When Creating Asset
我正在尝试使用 Contentful Content Management API 创建和发布图像作为资产,但到目前为止没有成功,我已经能够成功创建和发布条目,但我无法弄清楚为什么资产不起作用。这是我创建资产的代码。最终目标是使这个工作适用于 images/attachments 的数组,但我试图在处理多个之前让它只使用一个。
makeAsset = async (item) => {
try {
var MClient = createClient({
accessToken: process.env.REACT_APP_CONTENTFUL_MANAGEMENT_ACCESS_TOKEN,
});
let space = await MClient.getSpace(
process.env.REACT_APP_CONTENTFUL_API_SPACE
);
let environment = await space.getEnvironment(
process.env.REACT_APP_CONTENTFUL_ENVIRONMENT
);
const asset = await environment.createAsset({
fields: {
title: {
"en-US": item.imgNames[0],
},
file: {
"en-US": {
fileName: item.images[0].name,
contentType: item.images[0].type,
uploadFrom: item.imgUrls[0],
},
},
},
});
const processedAsset = await asset.processForAllLocales();
processedAsset.publish();
控制台中的错误是这样的:
ValidationFailed: {
"status": 422,
"statusText": "",
"message": "Validation error",
"details": {
"errors": [
{
"name": "type",
"value": "data:image/png;base64,iVBORw0KGg(The rest of the image URL from above)
"type": "Object",
"details": "The type of \"value\" is incorrect, expected type: Object",
"path": [
"fields",
"file",
"en-US",
"uploadFrom"
]
}
]
},
"request": {
"url": "assets",
"headers": {
"Accept": "application/json, text/plain, */*",
"Content-Type": "application/vnd.contentful.management.v1+json",
"X-Contentful-User-Agent": "sdk contentful-management.js/5.26.1; platform browser; os Windows;",
"Authorization": "Bearer ...7ijJE"
},
"method": "post",
"payloadData": "{\"fields\":{\"title\":{\"en-US\":\"scuba_mask\"},\"file\":{\"en-US\":{\"fileName\":\"scuba_mask.png\",\"contentType\":\"image/png\",\"uploadFrom\":\"data:image/png;base64,iVBORw0KG(The rest of image URL)
我一直在尝试搜索其他示例,因为文档不完整,并且 none 个示例对我有用。我尝试的一种解决方案是使用 fs.createReadStream() 函数,但该函数已从 React 中删除。
嘿嘿,这里是内容丰富的开发者关系。
你说得对,可以在这方面改进文档。 :/ 你给createAssetFromFiles都试试?
我们有两种不同的上传机制。
提供 URL Contentful 将获取以创建资产。在 JavaScript CMA SDK 中,这是 createAsset 方法。
触发直接文件上传。为此,我们提供 createAssetFromFiles.
我们也有这个a little bit older but working example in react。它使用 createAssetFromFiles
并使用内容管理 API 从浏览器直接上传文件。 :)
希望对您有所帮助,对于造成的困惑,我们深表歉意。
@stefan judis,我使用了示例中的代码,其中一个函数在较新的版本中已被弃用,所以我想我会冒险更换一些东西并且它起作用了。为以后遇到此问题的其他人提供参考,这里是解决我的问题的解决方案:
makeAsset = async (item) => {
try {
//Contentful API Call
var MClient = createClient({
//Fetch access token from environment variables
accessToken: process.env.REACT_APP_CONTENTFUL_MANAGEMENT_ACCESS_TOKEN,
});
//API call that requests the specified space
let space = await MClient.getSpace(
process.env.REACT_APP_CONTENTFUL_API_SPACE
);
let environment = await space.getEnvironment(
process.env.REACT_APP_CONTENTFUL_ENVIRONMENT
);
const file = item.images[0];
const contentType = file.type;
const fileName = file.name;
let asset = await environment.createAssetFromFiles({
fields: {
title: {
"en-US": fileName,
},
file: {
"en-US": {
contentType,
fileName,
file,
},
},
},
});
asset = await asset.processForAllLocales();
asset.publish();
} catch(error) {
console.log(error);
}
}
我正在尝试使用 Contentful Content Management API 创建和发布图像作为资产,但到目前为止没有成功,我已经能够成功创建和发布条目,但我无法弄清楚为什么资产不起作用。这是我创建资产的代码。最终目标是使这个工作适用于 images/attachments 的数组,但我试图在处理多个之前让它只使用一个。
makeAsset = async (item) => {
try {
var MClient = createClient({
accessToken: process.env.REACT_APP_CONTENTFUL_MANAGEMENT_ACCESS_TOKEN,
});
let space = await MClient.getSpace(
process.env.REACT_APP_CONTENTFUL_API_SPACE
);
let environment = await space.getEnvironment(
process.env.REACT_APP_CONTENTFUL_ENVIRONMENT
);
const asset = await environment.createAsset({
fields: {
title: {
"en-US": item.imgNames[0],
},
file: {
"en-US": {
fileName: item.images[0].name,
contentType: item.images[0].type,
uploadFrom: item.imgUrls[0],
},
},
},
});
const processedAsset = await asset.processForAllLocales();
processedAsset.publish();
控制台中的错误是这样的:
ValidationFailed: {
"status": 422,
"statusText": "",
"message": "Validation error",
"details": {
"errors": [
{
"name": "type",
"value": "data:image/png;base64,iVBORw0KGg(The rest of the image URL from above)
"type": "Object",
"details": "The type of \"value\" is incorrect, expected type: Object",
"path": [
"fields",
"file",
"en-US",
"uploadFrom"
]
}
]
},
"request": {
"url": "assets",
"headers": {
"Accept": "application/json, text/plain, */*",
"Content-Type": "application/vnd.contentful.management.v1+json",
"X-Contentful-User-Agent": "sdk contentful-management.js/5.26.1; platform browser; os Windows;",
"Authorization": "Bearer ...7ijJE"
},
"method": "post",
"payloadData": "{\"fields\":{\"title\":{\"en-US\":\"scuba_mask\"},\"file\":{\"en-US\":{\"fileName\":\"scuba_mask.png\",\"contentType\":\"image/png\",\"uploadFrom\":\"data:image/png;base64,iVBORw0KG(The rest of image URL)
我一直在尝试搜索其他示例,因为文档不完整,并且 none 个示例对我有用。我尝试的一种解决方案是使用 fs.createReadStream() 函数,但该函数已从 React 中删除。
嘿嘿,这里是内容丰富的开发者关系。
你说得对,可以在这方面改进文档。 :/ 你给createAssetFromFiles都试试?
我们有两种不同的上传机制。
提供 URL Contentful 将获取以创建资产。在 JavaScript CMA SDK 中,这是 createAsset 方法。
触发直接文件上传。为此,我们提供 createAssetFromFiles.
我们也有这个a little bit older but working example in react。它使用 createAssetFromFiles
并使用内容管理 API 从浏览器直接上传文件。 :)
希望对您有所帮助,对于造成的困惑,我们深表歉意。
@stefan judis,我使用了示例中的代码,其中一个函数在较新的版本中已被弃用,所以我想我会冒险更换一些东西并且它起作用了。为以后遇到此问题的其他人提供参考,这里是解决我的问题的解决方案:
makeAsset = async (item) => {
try {
//Contentful API Call
var MClient = createClient({
//Fetch access token from environment variables
accessToken: process.env.REACT_APP_CONTENTFUL_MANAGEMENT_ACCESS_TOKEN,
});
//API call that requests the specified space
let space = await MClient.getSpace(
process.env.REACT_APP_CONTENTFUL_API_SPACE
);
let environment = await space.getEnvironment(
process.env.REACT_APP_CONTENTFUL_ENVIRONMENT
);
const file = item.images[0];
const contentType = file.type;
const fileName = file.name;
let asset = await environment.createAssetFromFiles({
fields: {
title: {
"en-US": fileName,
},
file: {
"en-US": {
contentType,
fileName,
file,
},
},
},
});
asset = await asset.processForAllLocales();
asset.publish();
} catch(error) {
console.log(error);
}
}