Как мне ожидать обратного вызова внутри вызова функции в узле? - PullRequest
0 голосов
/ 29 апреля 2020

Хорошо, поэтому я пытаюсь сгенерировать публичный c и закрытый ключ, используя crypto (https://nodejs.org/api/crypto.html#crypto_crypto_generatekeypair_type_options_callback)

Дело в том, что один из параметров generateKeyPair: функция обратного вызова, и я не могу заставить свой код ждать обратного вызова для запуска. Это работает в конце концов, но к тому времени я уже пытался использовать данные. Идея состоит в том, чтобы сделать что-то вроде этого:

const _getKeyPair = (pwd: string): Object => {
    const { generateKeyPair }: any = require('crypto');

    const keyPair = { publicKey: '', privateKey: '' };
    generateKeyPair('rsa', {
        modulusLength: 4096,
        publicKeyEncoding: {
            type: 'spki',
            format: 'pem'
        },
        privateKeyEncoding: {
            type: 'pkcs8',
            format: 'pem',
            cipher: 'aes-256-cbc',
            passphrase: pwd
        }
    }, (err: Error, publicKey: string, privateKey: string) => {
        if (err) {
            throw err;
        }
        keyPair.publicKey = publicKey;
        keyPair.privateKey = privateKey;
    });

    return keyPair;
};

И позвоните:

const keyPair = _getKeyPair('myPassword');

1 Ответ

1 голос
/ 29 апреля 2020

crypto имеет два метода для генерации пары ключей: асинхронный generateKeyPair и синхронный generateKeyPairSync, который можно использовать, не беспокоясь о обратных вызовах, если вы этого хотите. Другой способ - обернуть метод обещанием и использовать await. Что-то вроде:

const _getKeyPair = async (pwd) => {
  const { generateKeyPair } = require('crypto');

  return new Promise((resolve, reject) => {
    generateKeyPair('rsa', {
      modulusLength: 4096,
      publicKeyEncoding: {
        type: 'spki',
        format: 'pem'
      },
      privateKeyEncoding: {
        type: 'pkcs8',
        format: 'pem',
        cipher: 'aes-256-cbc',
        passphrase: pwd
      }
    }, (err, publicKey, privateKey) => {
      if (err) return reject(err);
      resolve({publicKey, privateKey});
    });
  });
};

async function main() {
  const keyPair = await _getKeyPair('myPassword');
}

main();
...