我正在使用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 :(得分:1)
您的代码存在两个问题。
首先,您声明了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
}
};
希望,这有帮助。
答案 1 :(得分:0)
包 azure-keyvault
已被弃用,取而代之的是新的包来分别处理 Keyvault 密钥、机密和证书。对于您的场景,您可以使用新的 @azure/keyvault-secrets 包。
新包中的方法使用承诺而不是回调。这应该会大大简化您的代码。要将您的应用程序从旧包中移出,您可以查看 migration guide,其中列出了主要差异和需要注意的内容。
对您的代码的主要更改是:
var sqlPassword = async function(){
const credential = new DefaultAzureCredential();
const client = new SecretClient(KEY_VAULT_URI, credential);
const secret = await client.getSecret(secretName);
return secret.value;
};
要了解 DefaultAzureCredentiual 的工作原理,请参阅 readme for @azure/identity