在Node.js中,是否可以异步运行中间件功能?

时间:2020-08-10 00:07:28

标签: javascript node.js express middleware

我已经构建了一个中间件功能来验证用户访问令牌(JWT)...如果JWT已过期,我会根据用户的刷新令牌自动创建一个新的访问令牌(当然,如果它同样有效)

我想在某个时候,如果我有足够的用户,授权可能会成为瓶颈。我想确保这些功能异步运行(例如通过UV线程池)。

这是可能的,还是我甚至需要为此担心?

附录:

这是我在中间件功能中使用的解密例程。我也在使用jsonwebtoken。

'use strict';

const cryptoAsync = require('@ronomon/crypto-async');
const crypto = require('crypto');
const util = require('util');

class AES {
    constructor(key, iv, bitSize) {
      // supported stream ciphers:
      // aes-256-ctr (keySize=32, ivSize=16)
      // aes-192-ctr (keySize=24, ivSize=16)
      // aes-128-ctr (keySize=16, ivSize=16)

      if (!bitSize) bitSize = 128;

      if (bitSize !== 256 && bitSize !== 192 && bitSize !== 128) {
        throw new Error('AES requires a bitsize of 256, 192, or 128.');
      }

      if (!key || key.length !== bitSize/8) throw new Error(`A ${bitSize/8}-byte/${bitSize}-bit key is required.`);

      if (!iv || iv.length !== 16) throw new Error('A 16-byte/128-bit initialization vector is required.');

      this.algo = `aes-${bitSize}-ctr`;
      this.key = key;
      this.iv = iv;

      console.log(`Using the ${this.algo} algorithm ...`);
    }
 
    async encrypt(dataAsUtf8) {
        const cipherText = await util.promisify(cryptoAsync.cipher)(this.algo, 1, this.key, this.iv, Buffer.from(dataAsUtf8, 'utf8'));

        return cipherText.toString('hex');
    }

    async decrypt(dataAsHex) {
    if (!Buffer.isEncoding('hex')) throw new Error('Input must be in HEX format.');

        const cipherText = await util.promisify(cryptoAsync.cipher)(this.algo, 0, this.key, this.iv, Buffer.from(dataAsHex, 'hex'));

        return cipherText.toString('utf8');
    }

    static randomBytes = async bytes => {
        const bytesAsBuffer = await util.promisify(crypto.randomBytes)(bytes);

    return bytesAsBuffer;
    }
}

module.exports = AES;

1 个答案:

答案 0 :(得分:1)

除非要进行一些繁重的工作,例如生成非常大的报表等,否则很难在相当长的时间内编写代码来阻塞Node中的主线程。通过JWT令牌进行授权是完全轻量级的,这将不是问题,我可以保证这一点。如果这是计划,则无需将这种类型的工作推到单独的线程上。