asyn c и функция ожидания Node.js - PullRequest
0 голосов
/ 19 апреля 2020

Я следовал этому руководству для загрузки файлов в IPFS с использованием Node.js, но у меня возникла проблема, которая не появилась в учебнике! Это связано с Asyn c и функцией await, я не могу сделать это заявление

const fileHash = fileAdded[0].hash;

Я пытался с await

const fileAdded = await ipfs.add({path: Name, content: file});

но, к сожалению, я получил ошибку, которая is (ha sh undefined).

Я пытался с помощью функции обратного вызова, но я не уверен в своем способе, потому что переменная (fileAdded) не дала мне никакого ответа, а также была неопределена,

это полный код:

const ipfsClient = require('ipfs-http-client');
const express = require('express');
const bodyParser = require('body-parser');
const fileUpload = require('express-fileupload');
const fs= require('fs');

const ipfs = new ipfsClient({host: 'localhost', port: '5001', protocol: 'http'});
const app= express();
var hash = require('hash');

app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({extended:true}));
app.use(fileUpload());

app.get('/',(req,res)=>{
    res.render('home');
});

app.post('/upload',(req,res)=>{
    const f= req.files.file;
    const Name = req.files.file.name;
    const filePath ="files/"+ Name;

    f.mv(filePath,async(err)=>{

        if(err){
            console.log("error failed to download a file");
            return res.status(500).send(err);
        }

        const fileh = await addFile(Name,filePath);

        fs.unlink(filePath, (err)=>{
            if(err) console.log("error");
        });

        res.render('upload',{Name,fileh});
    });
});

const addFile= async(Name,filePath)=> {
    const file=fs.readFileSync(filePath);

    const fileAdded = await ipfs.add({path: Name, content: file});

    const fileHash = fileAdded[0].hash;

    return fileHash;
};

app.listen(3000,()=>{
    console.log("server is listen");
}); 

появляется эта ошибка:

error message Я пишу функцию обратного вызова, например:

const addFile= async(Name,filePath)=> {
const file=fs.readFileSync(filePath);


const fileAdded = await ipfs.add({path: Name, content: file},(err,res)=>{
    if(err)
    console.log(err);


const fileHash = fileAdded[0].hash;

return fileHash;});};

но значение fileAdded и fileHa sh не было определено.

после того, как я использовал этот код из @Always Learning:

  const addFile= async(Name,filePath)=> {
  const file=fs.readFileSync(filePath);
  const hashes = [];
  const filesAdded = ipfs.add({path: Name, content: file});
  for await (const result of filesAdded) {
    hashes.push(result.hash);
    console.log(result.hash);
    console.log(result);

  }

  return hashes; // if you know it's just one for example
};

Это дало мне информация о файле, но ha sh не работает, так как он дал мне неопределенное значение, я хочу извлечь просто ha sh как этот "QmRndAYkvH3D2qhmYfaAZvWT6MDi4NiJPbzJor3EL87rrb"

result

1 Ответ

0 голосов
/ 19 апреля 2020

Поскольку ipfs.add() возвращает асинхронный c -объектный объект, вам нужно использовать от for async до go через него следующим образом:

const addFile= async(Name,filePath)=> {
  const file=fs.readFileSync(filePath);
  const hashes = [];
  const filesAdded = ipfs.add({path: Name, content: file});
  for await (const result of filesAdded) {
    if (result.hash) {
      hashes.push(result.hash);
    } else if (result.cid) {
      hashes.push(result.cid.multihash); // guessing here - might be another part of the cid object
    } else {
      console.log("No hash found in",result);
    }
  }

  return hashes[0]; // if you know it's just one for example
};
...