Получение неправильного запроса при преобразовании набора JSON в Block в слабине

Я пытаюсь опубликовать отчет о маяке в Slack, используя комплект блоков. Я получаю код состояния 400. Не могли бы вы помочь мне понять, чего мне здесь не хватает? (не нашел похожего поста)

Отчет в формате JSON

{
  'Performance Score': [
    { Performance: ' 59 %', Color: 'ORANGE' },
    { Accessibility: '  85 %', Color: 'ORANGE' },
    { BestPractices: '  96 %', Color: 'GREEN' },
    { SEO: '  100 %', Color: 'GREEN' }
  ],
  'Performace KPI': [
    {
      'First Contentful Paint (FCP)': '1.7 s',
      'Speed Index': '4.7 s',
      'Largest Contentful Paint (LCP)': '8.7 s',
      'Total Blocking Time (TBT)': '70 ms',
      'Cumulative Layout Shift (CLS)': '0.012'
    }
  ]
}

Я пытаюсь опубликовать вышеизложенное в Slack, используя URL-адрес веб-хука вместе с набором блоков,

Я попробовал с

const reportblocks = [
            {
              "type": "section",
              "text": {
                "type": "mrkdwn",
                "text": "*Performance Score*"
              },
              "fields": [
                {
                  "type": "mrkdwn",
                  "text": `• Performance: ${payload['Performance Score'][0]['Performance']} (${payload['Performance Score'][0]['Color']})`
                },
                {
                  "type": "mrkdwn",
                  "text": `• Accessibility: ${payload['Performance Score'][1]['Accessibility']} (${payload['Performance Score'][1]['Color']})`
                },
                {
                  "type": "mrkdwn",
                  "text": `• Best Practices: ${payload['Performance Score'][2]['BestPractices']} (${payload['Performance Score'][2]['Color']})`
                },
                {
                  "type": "mrkdwn",
                  "text": `• SEO: ${payload['Performance Score'][3]['SEO']} (${payload['Performance Score'][3]['Color']})`
                }
              ]
            },
            {
              "type": "section",
              "text": {
                "type": "mrkdwn",
                "text": "*Performance KPI*"
              },
              "fields": [
                {
                  "type": "mrkdwn",
                  "text": `• First Contentful Paint (FCP): ${payload['Performace KPI'][0]['First Contentful Paint (FCP)']}`
                },
                {
                  "type": "mrkdwn",
                  "text": `• Speed Index: ${payload['Performace KPI'][0]['Speed Index']}`
                },
                {
                  "type": "mrkdwn",
                  "text": `• Largest Contentful Paint (LCP): ${payload['Performace KPI'][0]['Largest Contentful Paint (LCP)']}`
                },
                {
                  "type": "mrkdwn",
                  "text": `• Total Blocking Time (TBT): ${payload['Performace KPI'][0]['Total Blocking Time (TBT)']}`
                },
                {
                  "type": "mrkdwn",
                  "text": `• Cumulative Layout Shift (CLS): ${payload['Performace KPI'][0]['Cumulative Layout Shift (CLS)']}`
                }
              ]
            }
          ];

я осознаю

Slack notification sent successfully. Response: {"status":"fail","statusCode":400,"headers":{"date":"Mon, 08 Apr 2024 16:46:09 GMT","server":"Apache","vary":"Accept-Encoding","strict-transport-security":"max-age=31536000; includeSubDomains; preload","referrer-policy":"no-referrer","x-slack-unique-id":"ZhQfUQd89LozgBIYrwHtqgAAACM","x-slack-backend":"r","access-control-allow-origin":"*","x-frame-options":"SAMEORIGIN","content-type":"text/html","content-length":"7","via":"1.1 slack-prod.tinyspeck.com, envoy-www-iad-lopevkmr, envoy-edge-canary-bom-bccpskqz","x-envoy-attempt-count":"1","x-envoy-upstream-service-time":"217","x-backend":"main_normal main_canary_with_overflow main_control_with_overflow","x-server":"slack-www-hhvm-main-iad-szna","x-slack-shared-secret-outcome":"no-match","x-edge-backend":"envoy-www","x-slack-edge-shared-secret-outcome":"no-match"},"response":"no_text"}

Поэтому я изменил его на

const reportblocks = {
    type: "section",
    text: {
      type: "mrkdwn",
      text: `
      *Performance Score:*
      • Performance: ${payload["Performance Score"][0]["Performance"]} (${payload["Performance Score"][0]["Color"]})
      • Accessibility: ${payload["Performance Score"][1]["Accessibility"]} (${payload["Performance Score"][1]["Color"]})
      • Best Practices: ${payload["Performance Score"][2]["BestPractices"]} (${payload["Performance Score"][2]["Color"]})
      • SEO: ${payload["Performance Score"][3]["SEO"]} (${payload["Performance Score"][3]["Color"]})
      
      *Performance KPI:*
      • First Contentful Paint (FCP): ${payload["Performace KPI"][0]["First Contentful Paint (FCP)"]}
      • Speed Index: ${payload["Performace KPI"][0]["Speed Index"]}
      • Largest Contentful Paint (LCP): ${payload["Performace KPI"][0]["Largest Contentful Paint (LCP)"]}
      • Total Blocking Time (TBT): ${payload["Performace KPI"][0]["Total Blocking Time (TBT)"]}
      • Cumulative Layout Shift (CLS): ${payload["Performace KPI"][0]["Cumulative Layout Shift (CLS)"]}
      `,
    },
  };

я осознаю

Slack notification sent successfully. Response: {"status":"fail","statusCode":400,"headers":{"date":"Mon, 08 Apr 2024 16:43:12 GMT","server":"Apache","vary":"Accept-Encoding","strict-transport-security":"max-age=31536000; includeSubDomains; preload","referrer-policy":"no-referrer","x-slack-unique-id":"ZhQeoEg0VRsef1dgHS9gqAAAABw","x-slack-backend":"r","access-control-allow-origin":"*","x-frame-options":"SAMEORIGIN","content-type":"text/html","content-length":"7","via":"1.1 slack-prod.tinyspeck.com, envoy-www-iad-qmigteht, envoy-edge-bom-bevupifn","x-envoy-attempt-count":"1","x-envoy-upstream-service-time":"203","x-backend":"main_normal main_canary_with_overflow main_control_with_overflow","x-server":"slack-www-hhvm-main-iad-sbvy","x-slack-shared-secret-outcome":"no-match","x-edge-backend":"envoy-www","x-slack-edge-shared-secret-outcome":"no-match"},"response":"no_text"}

Я использую сценарий nodejs для публикации, и когда я запускаю его в обычном режиме без форматирования, он публикуется, но хочу, чтобы он был в формате JSON.

const Slack = require("slack-node");
const logger = require("../../reporting/logger");
const apiEndPoints = require("../../config/apiEndPoints");

const webhookurl = `${apiEndPoints.SLACK_SDET_URL}`;

async function sendSlackNotification(payload) {
    try {
      logger.info(`Sending Slack notification to: ${webhookurl}`);
  
      const slack = new Slack();
      slack.setWebhook(webhookurl);
  
      const reportblocks = [
        {
          type: 'section',
          text: { type: 'mrkdwn', text: '*Performance Score:*' },
          fields: payload['Performance Score'].map(score => ({
            type: 'mrkdwn',
            text: `${Object.keys(score)[0]}: ${Object.values(score)[0]}`,
          })),
        }
      ];
  
      const message = {
        blocks: reportblocks ,
      };
  
      slack.webhook(message, function (err, response) {
        if (err) {
          logger.error(`Error occurred while sending Slack notification: ${err}`);
        } else {
          logger.info(`Slack notification sent successfully: ${JSON.stringify(response)}`);
        }
      });
    } catch (error) {
      logger.error("Error occurred:", error);
    }
  }

sendSlackNotification();

module.exports = {
  sendSlackNotification,
};

Работает нормально

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Интеграция Slack и Spring Boot: как отправлять сообщения из Java-приложений
Интеграция Slack и Spring Boot: как отправлять сообщения из Java-приложений
Как отправлять сообщения в slack с помощью spring boot легко и без зависимостей.
0
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я исправил проблему и решил поделиться этим с сообществом.

Теперь проблема заключается в том, что библиотека npm принимает только текст в качестве полезной нагрузки.

const Slack = require("slack-node");

Итак, выберите новую библиотеку npm, которая

const { IncomingWebhook } = require("@slack/webhook");

И изменил код,

const { IncomingWebhook } = require("@slack/webhook");
const logger = require("../../reporting/logger");
const apiEndPoints = require("../../config/apiEndPoints");

//const webhookUrl = apiEndPoints.SLACK_SOLUTION_URL;
const webhookUrl = apiEndPoints.SLACK_SDET_URL;

async function sendSlackNotification(payload) {
  try {
    // Initialize the webhook with the provided URL
    const webhook = new IncomingWebhook(webhookUrl);

    // Construct the message payload
    const block = {
      blocks: [
        {
          type: "section",
          text: {
            type: "mrkdwn",
            text: "*Google Lighthouse Score [Home Page | Desktop Platform]*",
          },
        },
        {
          type: "section",
          fields: [
            {
              type: "mrkdwn",
              text: `• Performance: *${
                payload["Performance Score"][0]["Performance"]
              }* | ${setButtonBasedOnColor(
                `${payload["Performance Score"][0]["Color"]}`
              )}`,
            }
          ],
        }
      ],
    };

    // Send the payload to Slack
       await webhook.send(block);
  } catch (error) {
    logger.error(`Error sending Slack notification: ${error}`);
  }
}

module.exports = {
  sendSlackNotification,
};

Другие вопросы по теме