簡體   English   中英

同步鏈接承諾

[英]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);
            });
    });
};

decryptmakePostCall調用都返回要么rejectresolve 在本地運行良好,但是在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM