• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed NodeJS i Crypto - zapisywanie do zmiennej

Object Storage Arubacloud
0 głosów
95 wizyt
pytanie zadane 24 maja 2020 w JavaScript przez Allen Obywatel (1,010 p.)
zamknięte 24 maja 2020 przez Allen

W jaki sposób mogę zapisać wynik szyfrowania do zmiennej. Zmienna fileName zawiera undefined.

crypto.randomBytes(16, (err, buf) => {
          if (err) return reject(err);
          const fileName = buf.toString('hex') + path.extname(req.file.originalname);
        });

console.log(fileName);

Próbowałem też w ten sposób:

const fileName = crypto.randomBytes(16, (err, buf) => {
          if (err) return reject(err);
          return buf.toString('hex') + path.extname(req.file.originalname);
        });

console.log(fileName);

 

komentarz zamknięcia: Otrzymałem odpowiedź

2 odpowiedzi

+1 głos
odpowiedź 24 maja 2020 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 24 maja 2020 przez Allen
 
Najlepsza

Użycie callbacka sprawia, że metoda crypto.randomBytes działa asynchronicznie. W związku z tym, nie możesz zwrócić z niej wartości (drugi przykład/kod). W pierwszym przypadku tworzysz zmienną, która ma zasięg w obrębie callbacka, stąd nie widać jej na zewnątrz.

Przy podejściu asynchronicznym możesz wspomóc się Promisem:

new Promise((resolve, reject) => {
    crypto.randomBytes(16, (err, buf) => {
        if (err) reject(err);
        resolve(buf.toString('hex') + path.extname(req.file.originalname));
    })
}).then(fileName => console.log(fileName));


komentarz 24 maja 2020 przez Allen Obywatel (1,010 p.)
Czy jest jakiś sposób, żeby użyć zmiennej fileName w dalszej części kodu, np. gdy tworzę nowy model produktu, który będę wysyłał do bazy danych? Teoretycznie mógłbym wstawić cały kod w segment .then(), ale nie wiem czy jest to dobra praktyka.
komentarz 24 maja 2020 przez ScriptyChris Mędrzec (190,190 p.)

Albo, jak wspomniał @Ehlert, użyj async/await i przypisz wartość z rozwiązanego promisa do zmiennej:

// cały kod musi być umieszczony w funkcji z przedrostkiem async, inaczej pojawi się SyntaxError
const fileName = await new Promise((resolve, reject) => {
    crypto.randomBytes(16, (err, buf) => {
        if (err) reject(err);
        resolve(buf.toString('hex') + path.extname(req.file.originalname));
    })
});

, albo stwórz zmienną przed użyciem metody crypto.randomBytes i w jej callbacku przypisz do zmiennej to, co potrzebujesz. Pamiętaj jednak, że przypisanie do zmiennej wartości z callbacka odbędzie się asynchronicznie, czyli poza ciałem callbacka wartość zmiennej będzie undefined.

Jednak jeśli już zdecydujesz się na użycie Promisa, to możesz w then wykonać dalszy kod (np. wspomniane tworzenie modelu produktu):

function getRandomBytes() {
  return new Promise((resolve, reject) => {
      crypto.randomBytes(16, (err, buf) => {
          if (err) reject(err);
          resolve(buf.toString('hex') + path.extname(req.file.originalname));
      })
  });
}

function createNewProductModel(fileName) {
    // ...
}

getRandomBytes().then(fileName => {
    console.log(fileName);
    createNewProductModel(fileName);
});

Pamiętaj też, żeby obsłużyć ewentualne odrzucenie promisa z funkcji reject.

komentarz 24 maja 2020 przez Allen Obywatel (1,010 p.)
Wielkie dzięki
0 głosów
odpowiedź 24 maja 2020 przez Ehlert Ekspert (212,670 p.)
Nie możesz robić loga w taki sposób bo to wykonuje się asynchronicznie. Wrzuć go na koniec callbacka.

Zawsze możesz poszukać czy jest gdzieś w wersja tej funkcji z promisem i użyć await.

Podobne pytania

0 głosów
0 odpowiedzi 87 wizyt
pytanie zadane 25 lipca 2019 w JavaScript przez kevin Mądrala (5,010 p.)
0 głosów
1 odpowiedź 320 wizyt
pytanie zadane 27 kwietnia 2021 w Sieci komputerowe, internet przez FabQ Początkujący (450 p.)
0 głosów
2 odpowiedzi 159 wizyt
pytanie zadane 24 lutego 2020 w Offtop przez fff Gaduła (3,950 p.)

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...