0
私はラムダを書いてイベントデータを取り、SQSメッセージを作成して送信しました。AWSノードJSラムダプロミスチェーン
私はそれが約束を使用していますので、このラムダを変換しようとしていることから、しかし私はそれが言うエラーを見ておいてください。ここでは
TypeError: constructAsset(...).then is not a function
at handler (/var/task/src/index.js:80:10)
は約束を使用して、私のラムダの試みです。私はまた、エラーをキャッチし、コールバックで送信するために把握する必要があります。
エラーは、ラムダが、それはPromise
を返した場合にのみ、機能上.then
を呼び出すことができるノード6.10
'use strict'
var AWS = require('aws-sdk'),
sqs = new AWS.SQS({region: 'eu-west-1'});
// AWS data
const AWS_ACCOUNT_ID = process.env.aws_account_id;
const AWS_SQS_QUEUE_NAME = process.env.aws_sqs_queue_name;
const AWS_SQS_QUEUE_URL = 'https://sqs.eu-west-1.amazonaws.com/' + AWS_ACCOUNT_ID + '/' + AWS_SQS_QUEUE_NAME;
// Vlaidation schemas
const EVENT_TYPE_VALIDATION = ['foo', 'bar'];
const ASSET_TYPE_VALIDATION = ['foo', 'bar'];
const STRING_MATCH_PATTERN = new RegExp("^\/[a-z0-9\-\/]*$");
function buildMessageBody (asset, context) {
let uri = "api.url" + asset.asset_uri,
site_name = asset.site_name,
event_type = asset.event_type,
asset_type = asset.asset_type,
write_time = Date.now();
let MessageBody = {
"Message": {
"event_type": event_type,
"asset_type": asset_type,
"write_time": write_time,
"site_name": site_name,
"uri": uri,
}
}
return MessageBody;
}
function validateAsset (asset) {
if (!asset.asset_uri || !asset.site_name || !asset.asset_type || !asset.event_type) {
console.log('error', 'Invalid asset data ', 'Asset: ', JSON.stringify(asset));
return false
}
EVENT_TYPE_VALIDATION.includes(asset.event_type) ? true : false;
ASSET_TYPE_VALIDATION.includes(asset.asset_type) ? true : false
STRING_MATCH_PATTERN.test(asset.asset_uri) ? true : false;
STRING_MATCH_PATTERN.test(asset.site_name) ? true : false;
return asset
}
function constructAsset(event) {
let asset = {
asset_uri: event.asset_uri != '' ? event.asset_uri : null,
site_name: event.site_name != '' ? event.site_name : null,
asset_type: event.asset_type != '' ? event.asset_type : null,
event_type: event.event_type != '' ? event.event_type : null
}
return asset
}
function constructSQSParams(asset) {
let sqsParams = {
MessageBody: JSON.stringify(asset),
QueueUrl: AWS_SQS_QUEUE_URL
};
return sqsParams
}
function handler (event, context, callback) {
constructAsset(event)
.then(validateAsset)
.then(buildMessageBody)
.then(constructSQSParams)
.then(function (sqsParams) {
sqs.sendMessage(sqsParams, function(err, data) {
if (err) {
console.log('error', 'Message Failed To Send: ', err, ' Asset: ', JSON.stringify(asset));
callback('Error: Failed to send message');
} else {
console.log('success', 'MessageId: ' + data.MessageId, ' Asset: ', JSON.stringify(asset));
callback(null, 'Success: Message sent');
}
})
})
.catch(function (error) {
console.log(error);
callback(null, error)
})
}
exports.buildMessageBody = buildMessageBody;
exports.validateAsset = validateAsset;
exports.constructAsset = constructAsset;
exports.constructSQSParams = constructSQSParams;
exports.handler = handler;
こんにちは、非同期呼び出しを全くしていない、私が約束を見始めたとき、コードをきれいにする良い方法のように見えました。 おそらく、私はこれをやりたくないのですか? – chinds
はい、そうではありません。あなたは不必要に複雑さを増やします。あなたの流れはすでに同期しています。 –