node.js - 带有graphql和sqs的lambda在nodejs中向sqs发送2条消息?

标签 node.js amazon-web-services graphql amazon-sqs

我正在开发一个项目,需要编写一个 lambda 函数,该函数提供 AWS API 来处理 GraphQL 查询并将有效负载发送到 AWS SQS,一切正常,但当我检查我的 AWS SQS 队列时,它每条显示 2 条消息time 而不是 1,云 watch 也只显示一次函数触发。下面我与您分享我的代码,我们将非常感谢您的帮助。

index.js

const { graphql } = require("graphql");
const { schema } = require("./graphql/schema");

exports.handler = async (event) => {
    // getting query from lambda event
    const query = event.query;

    // getting query variables from lambda event
    const variables = event.variables;

    return await graphql(schema, query, null, null, variables);   
};

sqs.js

const AWS = require("aws-sdk");
AWS.config.update({ region: "us-east-1"});

// Create an SQS service object
const sqs = new AWS.SQS({apiVersion: '2012-11-05', "accessKeyId": process.env.ACCESS_KEY_ID, "secretAccessKey": process.env.SECRET_ACCESS_KEY});
const QueueUrl = process.env.SQS_QUEUE_URL;

const sendPayloadToSQS = message => {
    const params = {
        MessageBody: JSON.stringify(message),
        QueueUrl
    };

    await sqs.sendMessage(params, function(err, data) {
        if (err) {
            console.log("Message sending failed : ", err);
        } else {
            console.log("Message queued to SQS successfully : ", data.MessageId);
        }
    }).promise();

};

module.exports = sendPayloadToSQS;

graphql 突变文件

const { GraphQLNonNull } = require("graphql");
const { mutationWithClientMutationId } = require("../../common");
const { JobRequestEventResponse } = require("../jobRequestEventResponse");
const { JobRequestInput, JobEventMetadataInput } = require("../jobSchema");
const sendPayloadToSQS = require("../../../sqs");
const { newId } = require("../../../newId");

const JobRequestEvent = mutationWithClientMutationId({
  name: "JobRequestEvent",
  inputFields: {
    eventMetadataInput: {
      type: new GraphQLNonNull(JobEventMetadataInput),
    },
    eventInput: {
      type: new GraphQLNonNull(JobRequestInput),
    },
  },
  outputFields: {
    JobRequestEventResponse: {
      type: JobRequestEventResponse,
    },
  },
  mutateAndGetPayload: async (params) => {
    const new_id = newId();
    if(params.eventInput.jobId === null || params.eventInput.jobId === undefined) {
      params.eventInput.jobId = new_id; 
    }
    const payload = {
      _id: new_id,
      transactionId: new_id,
      name: params.eventMetadataInput.name,
      userRole: params.eventMetadataInput.userRole,
      date: params.eventMetadataInput.date,
      languageCode: params.eventMetadataInput.languageCode,
      eventInput: params.eventInput,
    };

    //send payload to sqs
    await sendPayloadToSQS(payload);

    return {
      JobRequestEventResponse: {
        id: payload._id,
        transactionId: payload.transactionId,
        status: "Success",
      },
    };
  },
});

module.exports = {
  JobRequestEvent,
};

最佳答案

我再次阅读文档,发现回调是问题的根本原因:如果我向 sendMessage 提供回调,它会触发我的函数,当我再次编写 Promise() 时,它会触发我的函数。函数,所以我只删除回调,如下所示。

引用:AWS Official documentation

而不是这个:

await sqs.sendMessage(params, function(err, data) {
        if (err) {
            console.log("Message sending failed : ", err);
        } else {
            console.log("Message queued to SQS successfully : ", data.MessageId);
        }
}).promise();

我这样写:

const request = sqs.sendMessage(params);
const result = await request.promise();

if(result) {
    console.log("Message queued to SQS successfully : ", result.MessageId);
} else {
    console.log("Message queued failed");
}

关于node.js - 带有graphql和sqs的lambda在nodejs中向sqs发送2条消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53946284/

相关文章:

javascript - 有没有简单的方法从页面上的 td 元素获取数组? (node.js/cheerio/jQuery)

node.js - Flatiron js - 总监 - 如何从表进行异步路由?

node.js - Ionic 2 Google FCM 推送通知图标

javascript - 如何在 forEach 中运行 useQuery?

reactjs - @apollo/client error-React Hook "useQuery"is called in function which is neither a React function component or a custom React Hook function

node.js - NodeJS SetInterval 与 Async/Await

amazon-web-services - Kubernetes:删除后,Replication Controller仍然存在

amazon-web-services - 无法从 EC2 实例访问使用 AWS API Gateway 公开的 Web 服务。返回 403 { "message": "Forbidden" }

bash - AWS Cloudformation - 使用 cfn-init 安装软件包

angular - "Cannot return null for non-nullable field"使用 Graphql 订阅 NestJS 时