链接同步承诺

时间:2017-07-03 11:28:15

标签: javascript node.js lambda promise

我正在使用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调用{}返回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}`);
            }
        });
    });
};

1 个答案:

答案 0 :(得分:1)

这是一个AWS lambda错误。有关此问题,请参阅issue at Bluebird's repobasic reproducing code

这个问题实际上与bluebird无关,而是与lambda部署的异步代码处理和调度有关。 https://github.com/nervous-systems/cljs-lambda/issues/62。这是另一个重现错误的问题:https://github.com/nervous-systems/cljs-lambda/issues/62

用户提出了一个常见问题:

  

天哪啊。以防万一其他人落在这里并犯了我的错误:确保您没有意外地使用localhost端点而不是实际的AWS区域特定端点部署AWS.config.update(...)。这可能会出现与上述相似的症状(例如,如果您使用的唯一异步函数是访问DynamoDB文档客户端),但原因完全不同。