Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 同步链接承诺_Javascript_Node.js_Lambda_Promise - Fatal编程技术网

Javascript 同步链接承诺

Javascript 同步链接承诺,javascript,node.js,lambda,promise,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) .th

我和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获得的错误是:

我需要先运行解密->获取密钥->然后生成后调用

编辑: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无关,而是与lambda部署上的异步代码处理和调度有关。下面是另一个重现错误的问题:

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

我的天啊。以防万一其他人在这里登陆并犯了我的错误:确保您没有意外部署AWS.config.update。。。使用本地主机终结点而不是实际的AWS区域特定终结点。如果您正在使用的唯一异步函数是访问DynamoDB文档客户机,但出于完全不同的原因,那么这可能会出现与上述类似的症状


到底是什么?如果decrypt和makePostCall已经返回了承诺,那么就没有必要用新的promise@Ryan添加makePostCall.FYI的代码-是您的第一个代码块的外观,它在功能上是等效的。。。哦,我需要先运行解密->获取密钥->然后进行调用。是的,这就是代码does@Gogo不,不是。至少在调用方法一次之后不会,因为这里的headers.Authorization='Basic'+auth_标记;您正在更改此值,而不再具有我从文件中拾取的静态值。
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}`);
            }
        });
    });
};