Я пытаюсь найти решение для создания нескольких активов в Довольный с помощью контент-менеджмент API.
Сценарий nodeJS для создания одного актива:
const client = contentful.createClient({
accessToken: '<content_management_api_key>'
})
client.getSpace('<space_id>')
.then((space) => space.getEnvironment('<environment-id>'))
.then((environment) => environment.createAssetWithId('<asset_id>', {
title: {
'en-US': 'Example 1'
},
file: {
'en-US': {
contentType: 'image/jpeg',
fileName: 'example1.jpeg',
upload: 'https://example.com/example1.jpg'
}
}
}))
.then((asset) => asset.processForAllLocales())
.then((asset) => asset.publish())
.then((asset) => console.info(asset))
.catch(console.error)
Что довольно просто и легко реализуется. Однако, если вы хотите создать несколько ресурсов, это не сработает.
После многих часов безуспешных поисков задокументированного способа достижения этой цели я пришел к
const contentful = require('contentful-management');
const assets = require('./assetObject.js');
async () => {
const client = contentful.createClient({
accessToken: '<content_management_api_key>'
});
const space = await client.getSpace('<space_id>');
const environment = await space.getEnvironment('<environment-id>');
const createdAssets = await Promise.all(
assets.map(
asset =>
new Promise(async () => {
let cmsAsset;
try {
cmsAsset = await environment.createAssetWithId(asset.postId, {
fields: {
title: {
'en-US': asset.title
},
description: {
'en-US': asset.description
},
file: {
'en-US': {
contentType: 'image/jpeg',
fileName: asset.filename,
upload: asset.link
}
}
}
});
} catch (e) {
throw Error(e);
}
try {
await cmsAsset.processForAllLocales();
} catch (e) {
throw Error(e);
}
try {
await cmsAsset.publish();
} catch (e) {
throw Error(e);
}
})
)
);
return createdAssets;
};
assetObject.js
[
{
link: 'https://example.com/example1.jpg',
title: 'Example 1',
description: 'Description of example 1',
postId: '1234567890',
filename: 'example1.jpeg'
}, ... // Many more
]
Это при запуске не вызывает ошибок и ничего не делает. Что я сделал не так? Это тот метод, который мне следует использовать?
Функция SDK processForAllLocales также имеет два параметра, которые вы можете настроить при необходимости, чтобы разрешить обработку ресурсов в случае возникновения ошибок: options.processingCheckWait и options.processingCheckRetries. Подробнее см. contentful.github.io/contentful-management.js/….
Спасибо @CharlieC. Оцените ваш ответ.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Новое обещание нужно «разрешить» и «отклонить», поэтому для меня код должен выглядеть так:
const createdAssets = await Promise.all(
assets.map(
asset =>
new Promise(async (resolve, reject) => {
try {
const cmsAsset = await environment.createAssetWithId(asset.postId, {
fields: {
title: {
'en-US': asset.title
},
description: {
'en-US': asset.description
},
file: {
'en-US': {
contentType: 'image/jpeg',
fileName: asset.filename,
upload: asset.link
}
}
}
});
await cmsAsset.processForAllLocales();
await cmsAsset.publish();
resolve(cmsAsset);
} catch (e) {
reject(e);
}
})
)
);
return createdAssets;
Надеюсь, это может помочь
@ xrobert35 дает правильный ответ, но я должен добавить одну вещь: когда вы обрабатываете ресурс, вы можете захотеть проверить, существует ли
asset.fields.file["en-US"].urlперед публикацией. Существованиеasset.fields.file["en-US"].url- единственное свидетельство того, что обработка файла, связанного с активом для этой локали, завершена.