• 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

0 głosów
245 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 (215,070 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 236 wizyt
pytanie zadane 23 lipca w Python przez CosmoWielki Użytkownik (730 p.)
0 głosów
0 odpowiedzi 245 wizyt
pytanie zadane 25 lipca 2019 w JavaScript przez kevin Mądrala (5,010 p.)
0 głosów
1 odpowiedź 526 wizyt
pytanie zadane 27 kwietnia 2021 w Sieci komputerowe, internet przez FabQ Początkujący (450 p.)

93,631 zapytań

142,553 odpowiedzi

323,056 komentarzy

63,139 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2459p. - CC PL
  9. 2184p. - Maurycy W
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1811p. - rafalszastok
  13. 1600p. - Rafał Trójniak
  14. 1588p. - Tomasz Bielak
  15. 1494p. - ssynowiec
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...