Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Node.js中,是否可以异步运行中间件功能?_Javascript_Node.js_Express_Middleware - Fatal编程技术网

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

Javascript 在Node.js中,是否可以异步运行中间件功能?,javascript,node.js,express,middleware,Javascript,Node.js,Express,Middleware,我已经构建了一个中间件函数来验证用户访问令牌(JWT)。。。如果JWT已经过期,我会自动从用户的刷新令牌创建一个新的访问令牌(当然,如果它也是有效的) 我想象,在某个时刻,如果我有足够的用户,授权可能会成为一个瓶颈。我希望确保这些函数异步运行(例如,通过UV线程池) 这是可能的,还是我必须担心 增编: 这是我在中间件函数中使用的解密例程。我也在使用jsonwebtoken 'use strict'; const cryptoAsync = require('@ronomon/crypto-as

我已经构建了一个中间件函数来验证用户访问令牌(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;

实际上,编写在节点中阻塞主线程很长时间的代码是相当困难的,除非您正在做一些非常繁重的工作,例如生成非常大的报告等。通过JWT令牌进行授权是完全轻量级的,不会有问题,我可以保证这一点。如果是计划的话,您不需要将该类型的工作推送到单独的线程上。

在Node.js中,“异步”通常指不阻塞执行的主线程。如果您的函数正在等待某个异步API,那么很好,主线程没有被阻塞。其他请求在您等待API调用回调、解析承诺等时进行处理。然而,我认为真正的问题可能是您实际上在这里谈论的是同步代码——这些代码只是“计算”,可能需要足够长的时间才能成为问题。是这样吗?Express中间件设计成能够异步执行。但我认为你对什么是异步有一个很大的误解。node.js中的异步函数不一定在单独的线程中运行,更不用说线程池了。特别是如果异步操作与网络相关,那么b/c my中间件将解密JWT并检查其签名的有效性。我只是担心这些过程可能是同步的。我使用“jsonwebtoken”库进行签名验证,但是对于解密,我使用@ronomon/crypto异步库。(见附录)。斯莱贝特曼,也许我不懂异步。那么,你是对的。如果异步代码不在单独的线程中,它将如何运行?我知道不需要线程池作为网络操作。使用操作系统调用,但我不知道Node.js如何异步运行。否则编码。