【发布时间】:2015-12-26 01:56:15
【问题描述】:
目前我正在尝试使用 AWS 作为后台服务构建某种消息传递服务。但是我很挣扎,因为到目前为止我从未使用过 Javascript。
基本思路是:如果DynamoDB有变化,通过推送消息通知“创建者”。
奇怪的是,当我点击“测试”时,它工作得很好,但是当我直接修改数据库时,什么也没有发生。更奇怪的是,一天一两次,当我在数据库中更改它时,我会收到通知。所以这一切似乎有点随机,我希望有人能帮助我。
这是在 lambda 上运行的代码
console.log('Loading function');
var aws = require('aws-sdk');
var doc = require('dynamodb-doc');
var dynamo = new doc.DynamoDB();
var async = require('async');
exports.handler = function(event, context) {
var target = null;
var status = null;
async.waterfall([
event.Records.forEach(function(record){
console.log("Function Invoked");
if(record.eventName == "MODIFY" && record.dynamodb.NewImage.creator.S!=record.dynamodb.NewImage.participant.S){
console.log("If-Cause entred!");
var creator = record.dynamodb.NewImage.creator.S;
var participant = record.dynamodb.NewImage.participant.S;
creator = JSON.stringify(creator);
status = JSON.stringify(record.dynamodb.NewImage.status.S);
creator = creator.replace(/"/g, "");
status = status.replace(/"/g, "");
participant = JSON.stringify(record.dynamodb.NewImage.participant.S);
participant = participant.replace(/"/g, "");
console.log("creator: "+ creator);
console.log("status: "+ status);
console.log("participant: "+ participant);
getArn(creator,function(response){
console.log("RESPONSE: "+ response);
// var name_part = null;
// getName(participant,function(response){
// name_part = response;
// });
var sns = new aws.SNS();
var payload_accepted = {
"GCM": "{ \"data\": { \"message\": \"Your event has been accepted!!\"} }"
};
var payload_declined = { "GCM": "{ \"data\": { \"message\": \"Your event has been declined!\" } }" };
// payload_declined.GCM.data.message = "Hello";
payload_accepted = JSON.stringify(payload_accepted);
payload_declined = JSON.stringify(payload_declined);
var payload;
if(status == "true"){
payload = payload_accepted;
}else{
payload = payload_declined
}
var params = {
TargetArn: response,
MessageStructure: 'json',
Message: payload
};
sns.publish(
params, function(err, data) {
if (err) {
console.log(err.stack);
// Notify Lambda that we are finished, but with errors
context.done(err, 'Brians Function Finished with Errors!');
return;
}
console.log('push sent');
console.log(data);
// Notify Lambda that we are finished
context.done(null, 'Brians Function Finished!');
});
});
}
})
],
function (err) {
context.done(null, 'Brians Function Finished!');
//this last function runs anytime any callback has an error, or if no error
// then when the last function in the array above invokes callback.
if (err) { sendForTheCodeDoctor(); }
});
};
function getArn(userid, callback) {
var params = {
TableName : "users",
Key : {
"id" : userid
},
ProjectionExpression: 'arn'
}
dynamo.getItem(params, function(err, data) {
if (err) {
console.log(err);
return err;
}
else {
console.log(data.Item.arn);
var response = data.Item.arn;
return callback(response);
}
});
}
感谢您的帮助:D
【问题讨论】:
标签: android node.js amazon-web-services amazon-dynamodb aws-lambda