es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cargando metadatos a IPFS utilizando la API de Pinata para NFTs.

Estoy teniendo un problema al cargar mis metadatos en Pinata a través de su API. Lo he intentado en un archivo de prueba y funciona perfectamente, pero en mi archivo más grande, está lanzando un error. Esta es mi función de carga a continuación. Creo que el problema es cuando upload(metadata) llama a createFile(data), está diciendo que fs.writeFile no es una función (cuando pruebo esa función directamente). Pero por ahora, console.log(filehash) está registrando “undefined”.

Supongo que necesitaré usar el módulo de ruta de npm para resolver este problema. Pero no estoy familiarizado con cómo usarlo/cómo funciona. Pero después de registrar en la consola en todos los lugares que se me ocurrieron, el problema parece ocurrir donde se llama a createFile. El archivo no se guarda en la carpeta “metadata”, por lo que la función de carga no envía los datos a la API. La autenticación de Pinata muestra “true” sin problemas.

Upload.js:

const fs = require('fs')
const path = require('path')
const pinataSDK = require('@pinata/sdk')

require('dotenv').config()

const pinata = pinataSDK(
  '0bb............e3',
  'a0ad52...............446f79a0be'
)

const createFile = (data) => {
  const jsonString = JSON.stringify(data)
  fs.writeFile(`./metadata/${data.publishingHistory}.json`,
    jsonString,
    (err) => {
      if (err) {
        console.log('Error al escribir el archivo', err)
      } else {
        console.log('Archivo de metadatos creado exitosamente')
      }
    }
  )
}

export const upload = async (metadata) => {
  try {
    const isAuth = await pinata.testAuthentication()

console.log(isAuth)

createFile(metadata)

const ipfsTransfer = await pinata.pinFileToIPFS(fs.createReadStream(`./metadata/${metadata.publishingHistory}.json`))

const filehash = `https://gateway.pinata.cloud/ipfs/${ipfsTransfer.IpfsHash}`
console.log(filehash)
return filehash
} catch (error) {}
}

Mi función mintArtwork:

  const mintArtwork = async (data) => {
    console.log(data)
    const hashUrl = await upload(data)
    console.log(hashUrl)
  }

Por cierto, como puedes ver en mi función mintArtwork(), aún no hay integración de contrato Web3. Una cosa a la vez. Solo estoy tratando de conectar correctamente mi IPFS a la API de Pinata.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución al problema de cargar metadatos a Pinata a través de la API

    Posible causa del problema

    El problema parece ocurrir cuando se llama a la función createFile, que debería crear un archivo JSON dentro de una carpeta de metadatos en el directorio actual y guardar los metadatos que se le pasan como argumento. La función fs.writeFile llamada dentro de esta función no parece reconocerse como una función cuando se prueba directamente. Esto provoca que la variable filehash no se defina y evita que los metadatos se carguen en la API de Pinata.

    Posible solución

    Una posible solución a este problema es la siguiente:

    • Como se señaló en el enunciado del problema, se requerirá el módulo path para acceder directamente a la carpeta en lugar de utilizar la ruta relativa.
    • Importar el paquete necesario: const path = require('path')

    • Utilizar la función path.resolve() en lugar de la función fs.writeFile para resolver correctamente la ruta de la carpeta de metadatos de la siguiente manera:

    const createFile = (data) => {
      const jsonString = JSON.stringify(data)
      const filePath = path.resolve(__dirname, `./metadata/${data.publishingHistory}.json`);
    
      fs.writeFile(filePath, jsonString, (err) => {
        if (err) {
          console.log('Error al escribir el archivo', err)
        } else {
          console.log('Archivo de metadatos creado correctamente')
        }
      })
    }
    
    • En la función upload, también utilizar la función path.resolve() para resolver correctamente la ruta del archivo de metadatos de la siguiente manera:
    const ipfsTransfer = await pinata.pinFileToIPFS(fs.createReadStream(path.resolve(__dirname, `./metadata/${metadata.publishingHistory}.json`)));
    

    Esto debería crear correctamente el archivo de metadatos dentro de la carpeta metadata en el mismo directorio que el archivo Upload.js y cargar su contenido en la API de Pinata a través de la función upload.

Comments are closed.