node.js - 如何在节点中的函数调用中等待回调?
问题描述
好的,所以我正在尝试使用加密生成公钥和私钥(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');
解决方案
crypto
有两种方法来生成密钥对,一种是异步的,另一种generateKeyPair
是同步generateKeyPairSync
的,如果你想要的话,你可以使用它们而不必担心回调。另一种方法是用 promise 包装方法并使用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();
推荐阅读
- python - Keras ModelCheckpoint 不在 Windows 上保存任何文件
- javascript - Angular Firebase - 从存储中下载文件
- php - 你如何计算下面数组中存在的单词数?
- malloc - 常量缓冲区的alignas_malloc() vs alignas()
- json - 我正在尝试在 React js 中对本地 json 文件进行排序,但出现错误:“TypeError:_Data_place_json__WEBPACK_IMPORTED_MODULE_1__ 不可迭代。”
- mysql - 在 mysql [42000] [1064] 中创建函数错误
- html - 一切都在不断移动到底部
- javascript - Puppeteer 错误,在抓取白页时无法读取未定义的属性“getProperty”
- node.js - Express 服务器返回文件而不是 HTML 页面
- docker - 如何连接到 docker 容器中的交互式进程