Javascript 同步链接承诺
我和AWS Lambda一起工作。我试图在一个异步函数中解密密钥&然后向另一个URL发出POST请求,这取决于首先从第一次调用中获取密钥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
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}`);
}
});
});
};