2017-06-30 8 views
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; 

答えて

0

を実行しているconstructAsset(event)

この行で発生します。あなたの機能がこのような場合 -

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()に電話することができます。

すべての機能が同じような場合です。また、コードで非同期呼び出しが行われていない場合は、約束を使用する必要はありません。

約束の詳細についてはhereをお読みください。

+0

こんにちは、非同期呼び出しを全くしていない、私が約束を見始めたとき、コードをきれいにする良い方法のように見えました。 おそらく、私はこれをやりたくないのですか? – chinds

+0

はい、そうではありません。あなたは不必要に複雑さを増やします。あなたの流れはすでに同期しています。 –