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.
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ónfs.writeFile
llamada dentro de esta función no parece reconocerse como una función cuando se prueba directamente. Esto provoca que la variablefilehash
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:
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ónfs.writeFile
para resolver correctamente la ruta de la carpeta de metadatos de la siguiente manera:upload
, también utilizar la funciónpath.resolve()
para resolver correctamente la ruta del archivo de metadatos de la siguiente manera:Esto debería crear correctamente el archivo de metadatos dentro de la carpeta
metadata
en el mismo directorio que el archivoUpload.js
y cargar su contenido en la API de Pinata a través de la funciónupload
.