2016-06-12 16 views
1

私は秘密を保管するためにazure-keyvaultを使用しています。設定ファイルで秘密を使用したいのですが、コールバックの問題があります。問題はbookshelf.jsを呼び出す前に返却されていない秘密で、パスワードは未定義です:秘密鍵保管庫のコールバック

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

は、keyvault.jsで 'promise'を発行しています。あなたはそれを宣言しましたが、決してそれを呼びませんでした。 –

+0

こんにちはSharma、答えはtqですが、パスワードはPromiseオブジェクトで、client.getSecretが呼び出されないようです... – Alvin

+0

実際、 'db'を作成すると、その時点で約束が保留状態です。解決策は、最初にパスワードを取得してからdbオブジェクトにロードすることができます。 –

答えて

1

あなたのコードには2つの問題があります。

まず、promiseオブジェクトを宣言しましたが、それを呼び出すことはありませんでした。

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 
    } 
}; 

希望、それが役立ちます。

+0

私はこれを試しましたが、なぜパスワードがプロミスオブジェクトであるのか、パスワードではないのか分かりません。 – Alvin