存储用于 Loopback 4 应用程序的临时变量

Storing temporary variables for use in Loopback 4 application

我有一个身份验证令牌,我想在多个 Loopback 4 控制器中使用。此令牌过期。过期后,我 运行 一些登录逻辑来获取新令牌。

我的问题是我不确定如何或在何处存储此令牌。

所以我可以在我的整个应用程序中使用它我正在考虑将令牌保存为环境变量,例如。

process.env.AUTH_TOKEN = 'TEST';

或者使用 Loopback 4 的应用级上下文 https://loopback.io/doc/en/lb4/Context.html

这些是否适合存储此令牌的解决方案?如果不是,替代解决方案是什么?

在使用 Context 的情况下,我将如何使用最佳实践来做到这一点?

考虑到以上所有评论,我建议您创建一个单独的模块,该模块将封装与您的身份验证令牌相关的逻辑以及您如何使用它。 IE。一个新模块将负责:

  • 当令牌为空时获取新令牌
  • 令牌的存储
  • 令牌过期后刷新令牌
  • API 调用的执行(或者你用那个令牌做的任何事情,抱歉,你的描述不清楚)- 可以移动到一个单独的模块,但这是一个不同的故事

我想您在 JavaScript 中的模块可能类似于:

let AUTH_TOKEN = "";

function makeAPICall(some, params) {
    if (! AUTH_TOKEN) {
        acquireNewToken();
    }

    if (expired()) {
        refreshToken();
    }

    return "some_data"; // TODO: here you do you what you want with your auth token and return some data
}

function acquireNewToken() {
    authToken = "new_token"; // TODO: put the logic to acquire a new token here
}

function refreshToken() {
    authToken = "new_token"; // TODO: put the logic to refresh a token here
}

function expired() {
    return false; // TODO: put the logic to check if token expired here
}

module.exports = {
    makeAPICall: makeAPICall
};

然后你可以在你所有的控制器中 require authModule 并像下面这样使用它:

let authModule = require('./modules/authModule');

authModule.makeAPICall("some", "params");

我相信您永远不需要将授权令牌暴露给您的控制器,因为您可以在 authModule 中实现与授权令牌使用相关的所有逻辑,并且只将一些参数传递给 makeAPICall 函数告诉它要做什么以及要获取哪些数据。但是如果你真的需要公开它,你可以稍微更改 authModule (添加 getToken 函数并将其添加到 module.exports):

function getToken() {
    return authToken;
}

module.exports = {
    makeAPICall: makeAPICall,
    getToken: getToken
};

现在,让我们回到您的问题:

Are these suitable solutions for storing this token? If not what would be an alternative solution?

如上所述,解决方案是将令牌存储为自定义模块范围内的局部变量。请注意,由于 Node.js uses caching for modules 您的 AUTH_TOKEN 变量在所有控制器中都是相同的(每个新的 require 将 return 您完全相同的对象具有相同的标记)。

如果您不想在每次需要访问 AUTH_TOKEN 时都 require authModule 您也可以简单地将其声明为全局变量:global.AUTH_TOKEN = ""; .请注意,全局变量有它的缺点,比如它可能导致文件之间的隐式耦合等。这是一篇关于何时应该和何时不应该使用全局变量的好文章:https://stackabuse.com/using-global-variables-in-node-js/

In the case of using Context, how would I go about doing this using best practices?

您也可以使用 Loopback 4 Context,它几乎等同于我上面提出的自定义 authModule 的解决方案。与客户模块的唯一区别 - 您可以在那里放置更多自定义逻辑,避免在控制器中复制粘贴您的一些代码。使用 Loopback 4 上下文,您可以使用服务器级上下文并将 AUTH_TOKEN 存储在那里,但是您仍然需要一些地方来获取新令牌并在它过期时刷新它。同样,您可以在自定义 authModule 中实现此逻辑。 IE。您仍然可以保留该自定义模块并同时将 AUTH_TOKEN 存储在 Loopback Context 中。这绝对没问题,但从我的角度来看,这会使代码更加复杂。