node.js - 从 lambda 向 sns 主题发布消息

我有一个 lambda 函数,它通过 AWS lambda 函数处理 POST 请求。它处理发布请求的主体并进行查询并返回响应。

我的 LAMBDA 函数

const { Pool, Client } = require("pg");
const userName = 'blah';
const hostEndPoint = 'blah';
const databaseType = 'blahblah';
const pwd = 'pass pass';
const portNumber = 5432;
var AWS = require('aws-sdk');

const pool = new Pool({
  user: userName,
  host: hostEndPoint,
  database: databaseType,
  password: pwd,
  port: portNumber
});


exports.handler = async (event) => {
  let body = JSON.parse(event.body);
  let name = body.name;
  let money = body.money;
  let todayDate = new Date();
  var status = 0;
  let text = 'INSERT INTO employee(name, date, salary) VALUES($1, $2, $3) RETURNING *';
  let values = [name, todayDate, money];
  var message = '';
  var status = 0;

  try {
    const res = await pool.query(text, values)
    message += 'successful'
    status = 200;
  } catch (err) {
    message += 'unsuccessful'
    if (err.code === '23505') {
      status = 406;
    }
  }

  var params = {
    Message: 'Hello From Lambda', /* required */
    TopicArn: 'arn:aws:sns:us-east-1:blahblahblah'
  };

  // Create promise and SNS service object
  var publishTextPromise = new AWS.SNS({ apiVersion: '2010-03-31' }).publish(params).promise();

  publishTextPromise.then(
    function (data) {
      console.log(`Message ${params.Message} send sent to the topic ${params.TopicArn}`);
      console.log("MessageID is " + data.MessageId);
    }).catch(
      function (err) {
        console.error(err, err.stack);
      });



  const response = {
    statusCode: status,
    body: JSON.stringify(message),
    headers: {
      "Access-Control-Allow-Origtin": '*'
    }
  };
  return response;
};

我的Lambda 资源政策 看起来像这样

{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "blah-blah-blah-blah",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-1:blah-blah-blah-blah-blah",
      "Condition": {
        "ArnLike": {
          "AWS:SourceArn": "arn:aws:execute-api:us-east-1:blahblahblahblha:blah/*/POST/"
        }
      }
    }
  ]
}

我还创建了一个 SNS 主题。如果我的状态为 200,我想向 SNS 主题发布消息。所以在我返回响应之前。我想做这样的事情。

if (status === 200){
  pubish some message to my sns topic
}

我是 aws 的新手,希望获得有关如何发布消息的指导。我觉得我很亲近。我确实遇到过这个 topic但这让我感到困惑,因为我正在 lambda 函数中编辑代码,所以为什么我需要要求 aws-sdk 而且他们也没有谈论更改权限。

尝试以下建议的答案后更新了代码

最佳答案

您可以看到,return response; 行将在 publish 未完成其任务时立即运行 - 向 SNS 发布消息。因为 publish, publishTextPromise.thenreturn 只是同步代码,它只需要一个滴答(~0,00..1 秒)到结束。当handler函数调用return时,函数会结束,这意味着所有正在做的任务都会被取消(包括publish过程,这个过程需要太多时间( ~ 一次完成)。

您将 async/await 语法与 promise 语法 (.then .catch) 混合使用,那么过程将不会如您所想(或想要)那样工作,我建议只使用 async/await 语法,如果可以的话。

使用您的代码,我邀请 publish 任务不会对响应产生影响,它只是尝试向 SNS 发布消息。 我的建议,改变

  publishTextPromise.then(
    function (data) {
      console.log(`Message ${params.Message} send sent to the topic ${params.TopicArn}`);
      console.log("MessageID is " + data.MessageId);
    }).catch(
      function (err) {
        console.error(err, err.stack);
      });

  await publishTextPromise // wait until the task done
    .then((data) => {
      console.log(`Message ${params.Message} send sent to the topic ${params.TopicArn}`);
      console.log("MessageID is " + data.MessageId);
    })
    .catch((err) => {
      console.error(err, err.stack);
    });

await 关键字已添加,我更喜欢箭头函数语法

https://stackoverflow.com/questions/60887889/

相关文章:

amazon-web-services - 卷 IOPS、卷吞吐量 (MiB/s) 和网络 (Gbp

vue.js - 如何在组件内导出和导入多个函数?浏览器

list - Prolog 从列表中删除元素

vue.js - Vue - 在 Chrome 开发工具中显示错误行

reactjs - 在创建或处理 React 应用程序时,我是否需要始终连接到互联网?

python - 导入错误 : cannot import name 'CONTRACTION_MA

html - 如何为本地文件设置背景图片url?

hyperledger-fabric - fabric-chaincode-go 和 fabric-

reactjs - react Hook UseEffect 与类名

css - Vuetify v-card 适合拼图(砌体布局)