nodejs асинхронный к синхронному - PullRequest
0 голосов
/ 20 января 2019

Я новичок в nodejs и javascript, и в настоящее время я работаю над проектом с открытым исходным кодом, поскольку вчера вечером я пытался преобразовать эту функцию из асинхронной в синхронную, но не смог, я использовал async / await, ноЯ думаю, что я не очень хорошо понял эту концепцию, эта функция шифрует и сжимает файлы с использованием алгоритма aes256, я работаю хорошо асинхронно, но я хочу добавить эту новую функцию, которая позволяет рекурсивно шифровать содержимое каталога.

function encrypt({ file, password }, error_callback, succ_callback) {
    const initVect = crypto.randomBytes(16);

    // Generate a cipher key from the password.
    const CIPHER_KEY = crypto.createHash('sha256').update(password).digest();;
    const readStream = fs.createReadStream(file);
    const gzip = zlib.createGzip();
    const cipher = crypto.createCipheriv('aes-256-cbc', CIPHER_KEY, initVect);
    const appendInitVect = new AppendInitVect(initVect);
    // Create a write stream with a different file extension.
    const writeStream = fs.createWriteStream(path.join(file + ".dnc"));

    readStream
      .pipe(gzip)
      .pipe(cipher)
      .pipe(appendInitVect)
      .pipe(writeStream);

    readStream.on('error', error_callback);
    readStream.on('end', succ_callback);
}

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Попробуйте использовать обещания. Слегка изменив код, можно выполнить обещание функции, а затем дождаться разрешения или отклонения всех обещаний, прежде чем предпринимать какие-либо действия.

function encrypt({ file, password }) {
  const initVect = crypto.randomBytes(16);

// Generate a cipher key from the password.
  const CIPHER_KEY = crypto.createHash('sha256').update(password).digest();;
  const readStream = fs.createReadStream(file);
  const gzip = zlib.createGzip();
  const cipher = crypto.createCipheriv('aes-256-cbc', CIPHER_KEY, initVect);
  const appendInitVect = new AppendInitVect(initVect);
// Create a write stream with a different file extension.
  const writeStream = fs.createWriteStream(path.join(file + ".dnc"));

  readStream
    .pipe(gzip)
    .pipe(cipher)
    .pipe(appendInitVect)
    .pipe(writeStream);


  const promise = new Promise();
  writeStream.on('error', err => promise.reject(err));
  writeStream.on('end', data => promise.resolve(data));
  return promise;
}

const promise1 = encrypt({file1, password1});
const promise2 = encrypt({file2, password2});

Promise.all([promise1, promise2])
  .then(succ_callback)
  .catch(error_callback);

Я не запускал этот код, поэтому для его работы может потребоваться некоторая настройка, но это общая суть.

0 голосов
/ 20 января 2019

Вам не нужно шифровать файлы синхронно, вы также можете делать это асинхронно. Чтобы просмотреть каталог и получить его файлы, используйте fs.readdir рекурсивно, пока вы не сможете найти больше файлов, а затем вы можете запустить encrypt для каждого найденного файла.

...