Nodejs - 在应用程序启动时从数据库获取值以供将来使用

时间:2016-12-23 09:32:40

标签: sql node.js callback

我从使用mssql数据库的nodejs应用程序开始。出于加密/解密的目的,我有加密密钥存储在数据库中,所以每次加密/解密时,首先我必须在数据库上调用以获取此值,在数据库调用的回调中解密,然后在另一个解密回调中function我用这个值把它传递给加密函数。

   sql.query("query to get key", [parameters],
            function (data) {
                if (data && (data.length == 1)) {       
                    Decrypt(data[0].Key, iv, salt, function (data) {
                        var decryptedKey = data;
                        Encrypt(inputData, decryptedKey, function (data){
                           var encryptedData = data;

我想要的是在另一个地方移动“从数据库获取密钥并解密”逻辑,实际上是在应用程序启动时从数据库中获取它并将其存储在变量中以便随处可用(decryptedKey):

sql.query("query to get key", [parameters],
            function (data) {
                if (data && (data.length == 1)) {       
                    AESDecrypt(data[0].Key, iv, salt, function (data) {
                        var decryptedKey = data;

因此,工作流程应该是:

  • 启动nodejs应用程序
  • 对数据库进行此异步调用,获取此密钥,解密并将其存储在全局变量
  • 在进一步调用加密功能
  • 中使用它

我已经尝试将其移到单独的帮助文件中,只是将这个帮助文件包含在加密/解密逻辑所在的文件中,但是单词“异步”会产生混淆。它读取帮助程序,进行加密/解密,但无法确定此辅助程序是否在加密逻辑使用之前初始化并返回KEY值,因为它是异步的。 因此,我在控制台中收到有关“未处理的承诺,承诺拒绝”等的错误消息。

在Encrypt(inputData,decryptedKey)函数使用它之前,它不能确保decryptedKey被初始化。

我能做些什么,在nodejs中有什么东西(在Angular中,有app.run()):

application.start() {
     // do some logic before all other actions
}

2 个答案:

答案 0 :(得分:0)

您需要将调用函数传递给application.listen()作为第二个参数,该参数在服务器启动后立即运行。

application.listen(9090,function(){
  //do some logic before all other actions
});

答案 1 :(得分:0)

我找到了解决方案。在函数帮助器中接受回调函数作为参数,从DB获取密钥,解密并成功将其传递给回调函数。

var decrypted = '';

var funcName= function (callback) {
   //get and decrypt key logic
   callback(data);
}

然后我在该帮助器中调用了相同的函数并传递了回调函数,该函数使用数据初始化我的全局变量“decrypted”:

funcName(function (data) {
   decrypted = data;
});

然后我在helper中有另一个函数,实际上将在app代码中的任何地方使用,其中需要加密/解密操作。它还将回调作为参数:

getDecrypted: function (callback) {
    if (decrypted == '') {
        funcName(function (data) {
            decrypted = data;
            callback(decrypted);
        });
    }
    else {
        callback(decrypted);
    }
},

因此,在应用程序启动时,我将使用数据初始化我的“decrypted”变量,无论我在哪里需要它,我只需要包含帮助器并使用getDecrypted函数,在其回调中使用我的加密或解密函数: / p>

var helper = require('helper');

helper.getDecrypted(function (decrypted) {
      encryptLogic(input, decrypted, function (data) {
       .
       .
       .

因此funcName将仅在app启动时调用一次,以在帮助程序中初始化“decrypted”变量。