관리 메뉴

개발이야기

[ Node.js] Slack Webhook 오류 처리 방법 본문

node js

[ Node.js] Slack Webhook 오류 처리 방법

안성주지몬 2022. 10. 13. 09:55

안녕하세요. 이번 포스팅은 Slack Incoming Webhook을 사용해 Slack 봇을 제작하는 과정에서 발생한 오류 해결 방법을 공유하고자 합니다.

 

- Slack Incoming Webhook 셋팅

Webhook을 사용하기 전 슬랙에 Incoming Webhook을 추가해주어야 합니다. 
Slack Api페이지에서 앱을 추가하거나 슬랙 워크스페이스 내에서 직접 추가하는 두 가지 방법이 있습니다.

Slack Api페이지에서 추가하는 방법 : https://api.slack.com/messaging/webhooks

 

Sending messages using Incoming Webhooks

Creating an Incoming Webhook gives you a unique URL to which you send a JSON payload with the message text and some options.

api.slack.com

Slack 워크스페이스 추가 : https://slack.com/intl/ko-kr/help/articles/115005265063-Slack%EC%9A%A9-%EC%88%98%EC%8B%A0-%EC%9B%B9%ED%9B%84%ED%81%AC

 

Slack용 수신 웹후크

수신 웹후크는 외부 소스에서 워크스페이스로 정보를 공유할 수 있는 간단한 방식입니다.   이용 방법 선택한 채널로 데이터를 보냅니다. 채널의 BAD+2CB...

slack.com


Incoming Webhook을 설치하는 방법은 간단하기도 하고 docs에 자세하게 설명이 나와있으니 자세한 설명은 생략하겠습니다.

- @slack/webhook 셋팅
이제 Node.js에서 webhook을 통해 쉽게 slack에 메시지를 보내주는 @slack/webhook모듈을 셋팅해줍니다.

@slack/webhook 셋팅 : https://slack.dev/node-slack-sdk/webhook

 

Slack | Incoming Webhooks

Slack Incoming Webhooks The @slack/webhook package contains a helper for making requests to Slack’s Incoming Webhooks. Use it in your app to send a notification to a channel. Installation $ npm install @slack/webhook Initialize the webhook The package ex

slack.dev

 

예제 코드 

const { IncomingWebhook } = require('@slack/webhook');
const url = process.env.SLACK_WEBHOOK_URL;

const webhook = new IncomingWebhook(url);

// Send the notification
(async () => {
  await webhook.send({
    text: 'I\'ve got news for you...',
  });
})();

 

- 오류 발생 
저는 Incoming Webhook을 워크스페이스 내에서 셋팅한 후 수신 웹후크 UR을 통해 메시지를 보냈으나 계속 404에러가 났습니다. 

구글링 중 slack api를 이용해 Incoming Webhook을 설치하니 오류가 해결되었다는 글을 보았고 똑같이 진행했으나 이번엔 403에러가 발생했습니다. 이렇다 할 솔루션을 찾지 못해 결국 slack에 문의 메일을 보내게됐습니다.

 

 

Slack 담당자는 노드 버전 및 패키지 사용을 권고 했습니다. 하지만 저의 node version은 16.x 였고 이미 @slack/webhook을 사용하고 있었습니다. 지속적으로 메일을 주고받았지만 확실한 해결책이 나오지 못했습니다. 메일을 주고받으면서도 계속 구글링을 했고 몇몇 예제에서 수신 웹후크 URL을 config 파일로 분리시킨 것을 보고 혹시나 하는 마음에 URL을 config 파일로 분리시켜 실행을 해봤습니다. 파일을 분리시키고 실행을 해보니 에러없이 메시지가 잘 가게 되었습니다. 하핫.. 

 

- slack webhook을 실행시키는 코드 

import logger from '../util/logger';
import * as slackHook from '@slack/webhook';
import {returnbase} from './slackconfig';

export async function sendSlackWebHook(msg) {
  try {
    const url = returnBaseURL();
    const webhook = new slackHook.IncomingWebhook(url);

    await webhook.send({
      text: msg,
    });
    } catch(err) {
      logger.info(err);
    }
}

 

- slackconfig.ts

let baseUrl =  "수신웹후크 URL"
export function returnBaseURL() {
  return baseUrl;
}

 

혹시나 저와 같은 문제를 겪고 계신 분이 있다면 위와 같이 config 파일로 분리시키면 잘 작동하실 겁니다!

Comments