2016-06-12 1 views
1

J'utilise azure-keyvault pour stocker le secret, je voudrais utiliser le secret dans mon fichier de configuration, mais confronté à un problème de rappel. Le problème est le secret n'est pas revenir avant d'appeler bookshelf.js et mot de passe est non définie:callback sur azure key vault

config.js:

var environment = process.env.NODE_ENV || 'development'; 
module.exports = require('./env/' + environment + '.js'); 

keyvault.js:

var sqlPassword = function(){ 
     var promise = new Promise(
     function resolver(resolve, reject) { 
      var secretId = secrectUri + 'secrets/password'; 
      client.getSecret(secretId, function(err, result) { 
       if (err) throw err; 
       resolve(result.value); 
      }); 
     } 
    ); 
}; 

module.export = { 
    sqlPassword: sqlPassword() 
}; 

env/development.js

var secret = require('../keyvault'); 

module.exports = { 
    db: { 
     client: 'mysql', 
     connection: { 
      host  : '127.0.0.1', 
      user  : 'sa', 
      password : secret.sqlPassword, 
      database : 'avin', 
      charset : 'utf8' 
     }, 
     debug: true 
    } 
}; 

bookshelf.js

var config = require('./config'); 

var knex = require('knex')(config.db); 
var bookshelf = require('bookshelf')(knex); 
bookshelf.plugin('registry'); 

module.exports = bookshelf; 

app.js

var config = require('./config/config'); 

var express = require('express'); 
var app = express(); 
var bookshelf = require('./config/bookshelf'); 

app.get('/', function (req, res) { 
    res.send('Hello World!'); 
}); 

app.listen(8000, function() { 
    console.log('Example app listening on port 8000!'); 
}); 
+0

problème avec le 'promise' dans keyvault.js. Vous l'avez déclaré, mais vous ne l'avez jamais appelé. –

+0

Salut Sharma, tq pour la réponse, mais le mot de passe est l'objet Promise, et ressemble à client.getSecret n'est pas appelé ... – Alvin

+0

oui, en fait lorsque vous créez le 'db', à ce moment la promesse est en attente. La solution peut être d'abord récupérer le mot de passe, puis le charger dans l'objet db. –

Répondre

1

Il y a deux problèmes avec votre code.

D'abord, vous avez déclaré l'objet promise, mais vous ne l'avez jamais appelé.

keyvault.js

var sqlPassword = function(){ 
    //promise code 
    return promise; 
}; 

module.exports = { 
    sqlPassword: sqlPassword 
}; 

env/development.js

module.exports = { 
    db: { 
     //some other code 
     connection: { 
     password : secret.sqlPassword().then(function(result){ 
      return result; 
     }), 
     }, 
     //some other code 
    } 
}; 

Hope, ça aide.

+0

J'ai essayé cela, mais je ne sais pas pourquoi le mot de passe est un objet Promise, à la place du mot de passe. – Alvin