#javascript #node.js
Вопрос:
Я пытаюсь извлечь изображение и строки src из каждого ресурса в файле json. Я могу захватить строку изображения, но так как src встроен в «файлы» [{}], поэтому мой скрипт не берет его, что приводит к ошибке:
ENOENT: такого файла или каталога нет, откройте «/home/user/pinner/src/undefined» (узел:1352316) Необработанное предупреждение об ошибке: Ошибка типа: Не удается прочитать свойство «данные» неопределенного
Вопрос ${asset.id}_src`, __dirname '/' asset.src`,
в том, как мне отредактировать это, чтобы получить строку src?
pin.js
const fs = require('fs').promises
const pinToIpfs = require("./pin-to-ipfs")
const Throttle = require("promise-parallel-throttle")
const assets = require("./assets.json")
async function main() {
const updated_assets = await Throttle.sync(
assets.map(asset => async () => {
const { ipfsLink: image, httpLink: imageLink } = await pinToIpfs(`${asset.id}_image`, __dirname '/' asset.image)
console.log(`[${asset.name}] pinned image to ipfs (${imageLink})`)
const { ipfsLink: src, httpLink: srcLink } = await pinToIpfs(`${asset.id}_src`, __dirname '/' asset.src)
console.log(`[${asset.name}] pinned src to ipfs (${srcLink})`)
return {
...asset,
image,
src
}
})
, { maxInProgress: 1 })
// write updated assets to assets.json
await fs.writeFile(__dirname '/assets.json', JSON.stringify(updated_assets, null, 2))
console.log('written updates to assets.json')
}
main()
активы.json (пример 1 актива)
{
"id": "PowerUp001",
"image": "images/tools/powerup_thumb.png",
"mediaType": "image/png",
"description": "Power Up Upgrade",
"files": [
{
"mediaType": "image/png",
"src": "images/tools/powerup.png"
}
],
"rarity": "5"
},
Ответ №1:
Поскольку asset.files
это массив , который вы не можете просто использовать asset.files.src
, вам нужно будет указать, какой индекс массива вы хотите src
получить. Итак, я бы предположил, что релевантен только первый элемент массива, и в этом случае используйте asset.files[0].src
Комментарии:
1. Большое спасибо, приятель, отлично. Вы правы, я изначально пытался «актив. files.src», но ваше объяснение показывает, почему это было неправильно. Хорошего дня.
Ответ №2:
Поскольку src
свойство находится внутри массива файлов, вы должны убедиться files
, что оно имеет хотя бы одно значение:
async function main() {
const updated_assets = await Throttle.sync(
assets.map(asset => async () => {
const { ipfsLink: image, httpLink: imageLink } = await pinToIpfs(`${asset.id}_image`, __dirname '/' asset.image)
console.log(`[${asset.name}] pinned image to ipfs (${imageLink})`)
const src = asset.files?.[0]?.src;
if (!src) {
// here you should handle the case when src is not set
// you can throw an error or set a default value
}
const { ipfsLink: src, httpLink: srcLink } = await pinToIpfs(`${asset.id}_src`, __dirname '/' src)
console.log(`[${asset.name}] pinned src to ipfs (${srcLink})`)
return {
...asset,
image,
src
}
})
, { maxInProgress: 1 })
// write updated assets to assets.json
await fs.writeFile(__dirname '/assets.json', JSON.stringify(updated_assets, null, 2))
console.log('written updates to assets.json')
}