javascript - Importer ipfs i TypeScript
Importering og modulinitialisering er generelt enkelt ved bruk av JavaScript/TypeScript ved å bruke enten require eller import. Jeg har problemer med å kjøre det grunnleggende eksemplet fra JS IPFS-nettstedet for å initialisere ipfs.
Hvis jeg følger de generelle instruksjonene, får jeg en feil: Module parse failed: Cannot use keyword 'await' outside an async function (6:13)
Dette er den kritiske koden:
const IPFS = require('ipfs-core');
const ipfs = await IPFS.create();
Hvis jeg følger forslaget om å plassere ipfs-opprettelsen i en async-funksjon, utsetter jeg bare det uunngåelige. Hvis jeg kaller en slik funksjon to ganger, får jeg en feil fra Unhandled Rejection (LockExistsError): Lock allerede holdes for fil: ipfs/repo.lock. Det ser ut til at jeg kunne lage et hack for å teste om ipfs allerede er opprettet eller ikke og initialisere det globalt i en modul som null, men det vil fortsatt være et hack.
Hvordan bør jeg implementere eller refaktorere const ipfs=await IPFS.create(); uten feil?
Svar #1
Sannsynligvis er din Node-versjon før versjon 14 og støtter ikke å kalle await på toppnivå. Du må være i konteksten av en asynkron blokk. Du kan gjøre noe som:
const IPFS = require('ipfs')
async function main() {
const ipfs = await IPFS.create()
/* Your code here */
}
// and now you can tell node to run your async main function...
main()
Sjekk https://v8.dev/features/top-level-await for mer informasjon om det i v8-motoren. Og jeg fant også dette innlegget om Node 14-støtte for det: https://pprathameshmore.medium.com/top-level-await-support-in-node-js-v14-3-0-8af4f4a4d478
Svar #2
I mitt tilfelle var det fordi jeg initialiserte IPFS unødvendig for mange ganger på rad. Etter å ha sørget for at IPFS-instansen bare initialiseres én gang når appen min starter, klarte jeg å løse feilen.
let ready = false
if(!ready) {
const ipfs = await IPFS.create()
ready = true
}
