Взятие строк из файла JSON, ошибка с субаттрибутом

#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')
}