лямбда с graphql и sqs отправляют 2 сообщения в sqs в nodejs? - PullRequest
0 голосов
/ 27 декабря 2018

Я работаю над проектом, в котором мне нужно написать лямбда-функцию, которая предоставляет AWS API для обработки запроса GraphQL и отправки полезной нагрузки в AWS SQS, все работает нормально, но когда я проверяю свою очередь AWS SQS, она показывает 2 сообщения каждоевремя вместо 1 и облачные часы также показывают триггер функции только один раз.ниже я делюсь своим кодом с вами, любая помощь будет очень признательна.

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,
};

1 Ответ

0 голосов
/ 28 декабря 2018

Я снова прочитал документацию и обнаружил, что обратный вызов является основной причиной моей проблемы: если я предоставляю обратный вызов sendMessage, он запускает мою функцию, а после повторного вызова обещания () запускает мою функцию, поэтому я удаляюОбратный вызов только так, как вы видите ниже.

См .: Официальная документация AWS

Вместо этого:

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");
}
...