[英]Chaining a variable number of promises synchronously that share a resource in Javascript
[英]Chaining promises synchronously
我正在使用AWS Lambda。 我正在嘗試解密異步函數中的密鑰,然后向另一個URL發出POST請求,這取決於從第一次調用中首先獲取密鑰。
module.exports = function (payload) {
return new Promise(function(resolve, reject) {
var headers = config.Headers;
decrypt(headers.Authorization)
.then(function (auth_token) {
headers.Authorization = 'Basic ' + auth_token;
console.log('dispatch got the key from kms');
return makePostCall(headers, payload);
})
.then(function (changeNumber){
console.log(changeNumber);
return resolve(changeNumber);
})
.catch (function (error) {
console.error('Error during dispatch: ' + error);
return reject(error);
});
});
};
該decrypt
& makePostCall
調用都返回要么reject
或resolve
。 在本地運行良好,但是在Lambda上運行時,僅成功運行了幾次,這使我相信問題在於makePostCall
函數的異步調用。 我從( catch
)得到的錯誤是:
Error during dispatch: null
我需要先運行解密->獲取密鑰->然后運行MakePostCall。
編輯: makePostCall看起來像這樣:
function makePostCall(headers, payload) {
return new Promise(function (resolve, reject) {
const url = config.serviceNowEndpoint + config.serviceNowChangeUri;
request.post({
url: url,
method: 'POST',
headers: headers,
json: payload
}, function (error, response, body) {
if (!error) {
return resolve(body.change_request.number);
}
else {
return reject(new Error('Returned with status code: ' + response.statusCode));
}
});
});
}
更多編輯 :根據@Jaromanda X的建議,將代碼修改為:
module.exports = function (payload) {
var headers = config.Headers;
return decrypt(headers.Authorization)
.then(function (auth_token) {
headers.Authorization = 'Basic ' + auth_token;
console.log('dispatch got the key from kms');
return makePostCall(headers, payload);
})
.catch (function (error) {
console.error('Error during dispatch: ' + error);
return error;
});
};
問題仍然存在。 在本地運行良好,但在Lambda上異步
編輯添加解密代碼:
const AWS = require('aws-sdk');
const config = require('../config/config');
module.exports = function(token) {
return new Promise(function (resolve, reject) {
const kms = new AWS.KMS({ region: config.aws_region.region});
const params = {
CiphertextBlob: new Buffer(token, 'base64')
};
kms.decrypt(params, function (err, data) {
if (!err) {
console.log('decrypted successfully');
return resolve(data.Plaintext.toString());
} else {
return reject(`${err.message}`);
}
});
});
};
那是一個AWS Lambda錯誤。 請在Bluebird的存儲庫和基本的復制代碼上查看該問題。
這個問題實際上與bluebird無關,但與lambda部署上的異步代碼處理和調度有關。 https://github.com/nervous-systems/cljs-lambda/issues/62 。 這是重現該錯誤的另一個問題: https : //github.com/nervous-systems/cljs-lambda/issues/62 。
用戶提出了一個常見問題:
哦,我的上帝。 萬一其他人落在這里並犯了我的錯:請確保您沒有使用本地主機終端節點而不是實際的特定於AWS區域的終端節點意外地部署了AWS.config.update(...)。 這可能會表現出與上述類似的症狀(例如,如果您使用的唯一異步功能是訪問DynamoDB文檔客戶端),但原因完全不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.