AWS Node JS Lambda承诺链

时间:2017-06-30 08:24:51

标签: javascript node.js lambda promise

我写了一个lambda来获取事件数据并构造并发送SQS消息。

我已经尝试过转换这个lambda以便它使用promises,但是我一直看到一个错误,它说:

TypeError: constructAsset(...).then is not a function
at handler (/var/task/src/index.js:80:10)

这是我使用promises的lambda尝试。我还需要弄清楚捕获错误并在回调中发送它。

此行constructAsset(event)

发生错误

lambda正在运行Node 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;

1 个答案:

答案 0 :(得分:0)

如果函数返回.then,则只能在函数上调用Promise。如果你的功能是这样的 -

function constructAsset(event) {
    return new Promise((resolve, reject) => {
        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
        }
        resolve(asset);
    });
}

然后,您就可以致电constructAsset(event).then()

所有功能的情况类似。如果您的代码没有进行任何异步调用,那么您不需要使用promises。

详细了解promises here