반응형

분명 잘 실행됐던 프로젝트인데......

갑자기 실행하는데 mariadb연결하는 부분에서 오류가 발생했습니다

왜지? 왜지??

밑에 오류 문구를 보니까 'host.docker.internal' 가 mariadb에서 허용이 안됐다고하네요.

 

원래 해당 프로젝트는 MariaDB  + MongoDB를 사용해서 도커는 관련이없었는데

다른프로젝트에서 사용할려고 docker를 실행시켰습니다.

이 플젝에서 도커를 사용하는게 아니니까 문제가 없을거라고 생각했는데 둘이 동시에 사용이 불가능한가봐요..

 

1. 포트 변경

mariadb(mysql) 기본 포트가 3306인데 도커도 기본 포트가 3306이래요

그래서 둘이 동시에 사용할거라면 3306, 3307 이런식으로 포트를 구분해줘야합니다 ㅜㅜ

 

2. mariadb에 docker 허용해주기

저는 도커는 잠깐 사용할예정이라 포트는 냅두고 마리아db쪽에서 허용하는것을 선택했습니다.

 

- Mysql Client cmd 실행

mariadb 접속

 

- docker서버 권한 부여

GRANT ALL PRIVILEGES ON . TO 'your_username'@'host.docker.internal' IDENTIFIED BY 'your_password';
FLUSH PRIVILEGES; //변경사항 업데이트(새로고침)

your_username: 사용하는 이름 넣으면됩니다. 보통 root 사용

 

if) username: root, password: 1234를 사용한다면

GRANT ALL PRIVILEGES ON . TO 'root'@'host.docker.internal' IDENTIFIED BY '1234';

이렇게 넣어주시면 됩니다

권한 넣고 프로젝트 실행시키면 오류없이 실행됩니다!

 

- 적용된 권한 확인

SHOW GRANTS FOR '사용자계정'@'접속위치';

ex) show grants for 'root'@'localhost';

반응형
반응형

게임하면서 디코 봇을 이용해서 노래를 많이듣는데 서버가 말을 안들을때가 많더라구요

그래서 직접 한번 추가해볼려고합니다.

노래이외에도 뭔가 기능을 추가해보고싶은데.. 아직 기능은 못정해서 ㅋㅋㅋㅋ

일단 디코 봇을 추가하고 서버에 추가하는 것까지 노드를 이용해서 연결해볼려고 합니다.


1. 디코 봇 생성하기

https://discord.com/developers/applications

 

Discord Developer Portal — API Docs for Bots and Developers

Integrate your service with Discord — whether it's a bot or a game or whatever your wildest imagination can come up with.

discord.com

새로운 봇 추가

디스코드 페이지에서 로그인을 하고 new application을 클릭하여 새로운 봇을 생성해보겠습니다.

사용할 봇의 이름을 입력하고 create 버튼을 눌러줍니다.

 

2. 봇 추가하기

서버에서 좌측 'Bot'을 클릭하고 Add bot을 클릭해서 추가해줍니다.

Yes, do it! 이라고 아주 상큼하네요

 

봇에서 설명과 이미지를 설정할수있습니다.

봇은 로그인을 토큰값을 이용해서 하는거같더라구요 reset token을 이용해서 새로운 토큰을 발급받으면됩니다.

토큰은 한번만 발행되기때문에 유출되지 않게 따로 저장해두셔야합니다!!!!

 

퍼블릭 설정여부로 공개봇을 생성할지 개인봇을 생성할지 결정할 수 있습니다.

 

Bot 기본 설정을 추가해주고 봇의 권한을 설정할수있습니다.

OAuth2 에서도 같은 기능을 수정할 수 있습니다!

헷갈리는 거 빼고 뭔가 필요해보이는것만 추가했습니다..ㅎㅎ

 

이번엔 OAuth2에서 연결할 수 있는 링크를 생성해보겠습니다.

OAuth2 URL Generator 에서 bot을 클릭해줍니다.

위에서 봇 설정을 해줬었는데 따로 연결되는건 없더라구여..

봇쪽에서 따로 설정안해줘도 이곳에서 설정해도 문제없을것 같습니다!

bot 설정까지 끝내면 밑에 클라이언트 ID와 함께 generated url이 생성됩니다.

 

3. 서버에 봇 추가하기

해당 링크로 접속을 해보면 제 서버와 연결되는 곳으로 설정이 가능합니다.

아근데 이거 서버 설정을 동시에 못하더라구여 ㅋㅋㅋㅋㅋㅋㅋ

동시에 2개의 서버로 접근하는 방법을 모르겠습니다......

페이지 1번에 1개의 서버로 접근이 가능해서 저는 2번열어서 처리했습니다!!

 

두번 다 문제없이 서버에 추가되는 것을 확인했습니다!!

다른곳으로 옮겨가는 형태가 아니어서 다행이군요ㅎㅎ


자 이제 바로 노드 서버를 연결해보겠습니다.

 

노드가 이미 설치되어있다고 가정하고 진행하겠습니다.

 

1. 디스코드 모듈 설치

npm install --save discord.js

2. 메인 코드 작성 [ main.js ]

const Discord = require("discord.js");
// const client = new Discord.Client();
const { Client, GatewayIntentBits } = require('discord.js');

const client = new Discord.Client({
  intents: [
    GatewayIntentBits.Guilds, //GUILDS
    GatewayIntentBits.GuildMessages, //GUILDS_MESSAGES
  ]
});

const token = require("./config/token.json"); //토큰 연결
const prefix = "!!"; //명령어 접두어

client.on('ready', () => { 
    console.log(`Hello~ ${client.user.tag}!`); //서버 구동시 Hello~ [내 봇 정보]! 하고 뜸
});

// client.on('interactionCreate', async interaction => {
//     if (!interaction.isChatInputCommand()) return;
// 
//     if (interaction.commandName === 'ping') { //ping이라는 메세지를 전송시
//         await interaction.reply('Pong!'); //Pong! 이라고 답변이 감
//     }
// });

client.login(token.token); //로그인 토큰정보

저는 토큰이나 DB 정보같은 경우 config라는 폴더를 생성해서 따로 저장하는 편입니다.

토큰값은 직접 연결해줘도 문제없지만 저는 따로 추가했습니다!

 

+ 토큰 설정 [ config/token.json ]

{
	"token": "본인의 토큰값 넣기"
}

 

처음에 new Discord.Client(); 코드를 사용했는데(주석처리된 부분) 저는 intents 값이 덜 들어가있다고 자꾸 오류나더라구요ㅜㅜ

보니까 discord.js 가 v14로 올라오면서 명령어가 변경된거 같네요..

Client() 함수 안에 인자값을 설정해줘야하고 해당 값은 밑의 링크를 통해 해결했습니다.

GUILDS 가 어떻게 GatewayIntentBits.Guilds 로 변하다니 흑흑ㅜㅜ

이거때문에 서버 구동하는데 시간이 좀 걸렸네요ㅜㅜ

 

+ 솔루션 참고

https://jtuto.com/discord-js-invalid-bitfield-flag-or-number-guilds/

 

[SOLVED] Discord.js: Invalid bitfield flag or number: GUILDS - JTuto

This Content is from Stack Overflow. Question asked by Arman

jtuto.com

 

그렇게 로그인 토큰을 적용해서 node [파일명]을 입력해주시면 서버가 구동됩니다.

저는 갠적으로 nodemon을 설치해서 사용하는 편이어서 각자에 맞는 명령어를 입력해주시면 될 것 같습니다.

서버가 온라인으로 켜지는 것을 확인할 수 있습니다!!

 

기초코드는 discord.js 참고해서 추가했습니당!

https://discord.js.org/#/docs/discord.js/main/general/welcome

 

Discord.js

Discord.js is a powerful node.js module that allows you to interact with the Discord API very easily. It takes a much more object-oriented approach than most other JS Discord libraries, making your bot's code significantly tidier and easier to comprehend.

discord.js.org

https://discordjs.guide/

 

discord.js Guide

Imagine a guide... that explores the many possibilities for your discord.js bot.

discordjs.guide

 

++ 근데 저는 이거 서버에 메세지 보내도 안받아와지더라구여??

뭔가 서버 설정이 덜된건지 코드가 다른건지 아예 신호를 못받아와서;;;;;

나중에 해결법이랑 기능추가해서 돌아올게요..ㅎㅎ;;

 

 


+++ discord.js v14로 올라오면서 변경된 부분이 꽤 있는거같네요;;

interactionCreate 를 이용해서 메세지를 받아오는 예제를 사용했는데 저는 메세지를 올려도 반응이 없더라구요.

뭐가 문제인가했는데 intents 설정하는 부분에서 메세지 추가하는 빌더를 따로 추가해줘야했습니다..

 

const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages] });

GuildMessages를 추가적으로 생성해주시고

 

client.on('messageCreate', msg => {
  msg.reply("드디어 성공!");
});

interactionCreate 대신 messageCreate 를 이용해서 reply를 날려보았습니다.

 

드디어 성공했습니다ㅠㅠㅜㅠㅜㅠㅜ 아니근데 이거 reply가 5번이나 날아오더라구요 ㅋㅋㅋㅋㅋ

아주 중간이 없습니다. 화가 나네요.

 

최종으로 동작시킨 main.js 코드입니다!!

const Discord = require("discord.js");
const { Client, GatewayIntentBits, EmbedBuilder } = require('discord.js');
const client = new Discord.Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages] });
const token = require("./config/token.json");

client.once('ready', () => { 
  console.log(`Hello~ ${client.user.tag}!`);
});

client.on('messageCreate', msg => {
  msg.reply("드디어 성공!");
});

client.login(token.token);

명령어 받고 예외처리하는 부분은 나중에 추가해야겠네요.

메세지를 받아온것만으로 기쁘네요 ㅎㅎ

반응형
반응형

안녕하세요 OB입니다.

최근에 nodejs를 이용해서 웹 서버를 구축하는 작업을 해보고 있습니다.

nodejs는 강의로 조금.. 접해본 수준이어서 작업이 수월하지는 않네요ㅎㅎ

웹 서버를 구축하기 위해 DB와 연동하는 과정에서 많은 오류가 발생했는데

그중 가장 저를 🐶고생시킨 'TypeError: ~ is not a function' 에러를 확인해보겠습니다!

 


 

 

간단하게 오류문을 해석해보면 pool.query 함수가 함수로서 제대로 동작을 하지 않고 있는 것을 알 수 있습니다.

아무래도 nodejs를 많이 다뤄보지 않아서 여러 자료를 찾아보고 코드를 작성했는데

남들은 되는 코드가 저는 동작하지 않는 점이 굉장히 의문이 많이 들더라구요..

 

그래서 함수가 제대로 동작하지 않는 이유를 생각해보았습니다.

저는 두 가지의 경우를 떠올릴 수 있었는데

 

  1. 함수명이 겹치는 경우(이미 선언된 변수와 겹친 경우)

  2. 함수가 정의가 되지 않은 경우

 

이렇게 두 가지였습니다.

뭔가 이렇다 할만한 오류도 아닌거같은데 해결은 안되니 엄청 답답하더라구여.

pool.query를 함수로 만들려고 (); 붙이니 연결된 코드가 함수가 아니라고 하곸ㅋㅋㅋㅋㅋㅋ

 

1. 함수명이 겹치는 경우

저는 1번에 해당하는 오류로 function 에러가 발생했더라구여.

위의 사진에서 pool이라는 변수를 이용해 함수를 만들었는데 다른 코드에서 pool을 이미 사용하고 있어서

중복이 발생했다는..ㅎㅎ

굉장히 간단한 문제인데 이걸 일주일을 잡고 오류해결하고있었으니 이렇게 허무할수가 없더라구여

진짜 다 완성한 코드인데 이걸!! 이걸 일주일을!!!!@@@!!!!!!!!!!!!!!!!!

변수명을 안겹치게 다시 작성해준다면 문제없이 코드가 동작할 것입니다.

실제로 저도 pool에서 con이라는 변수로 변경하니까 오류없이 동작했습니다!!

 

2. 함수가 정의가 되지 않은 경우

함수를 사용하기 위해서는 먼저 정의를 해야하죠.

function이라는 명령어를 이용해 함수를 정의하고 그것을 이용하면 되는데

간단하게 코드로 살펴보면 이런식으로 구성할 수 있습니다!

ah라는 js파일을 만들어서 함수 sum을 정의하고 sum함수에 data1, data2에 각각 1을 넣어 console에 찍는 코드입니다.

코드를 실행해보면 이런식으로 2라는 값이 리턴되는 것을 확인할 수 있습니다.

 

그런데 만약,, console.log(sum(1,1));과 함수를 정의한 위치를 변경하면 값이 어떻게 나올까요?

이런식으로 코드를 변경하면.. 놀랍게도 콘솔에서 2라는 값이 출력되는 것을 확인할 수 있습니다!!

 

그렇기에 함수를 정의한 위치가 조금 달라진다고 하여 크게 오류날일은 없을 것이라고 생각하고

함수를 정의하지 않고 사용하는 경우는 거의 없으니까..?

혹시 정의가 되지 않았다면 아마 'ReferenceError: ~ is not defined' 에러가 발생할 것입니다.

이런 경우라면 함수 정의를 추가해주시면 됩니다.

 

1, 2번의 방법 모두 코드를 잘 확인해야한다는것이 개빡치네요

오류가 발생한다면 변수명은 정말 꼭 한번 다시 확인해보세요.

코드를 쓰다보면 비슷한 변수가 굉장히 많이 생겨서 헷갈리게 되는데

이부분에서 저도 오류 잡는데 한참 걸렸네요ㅜㅜ

반응형

+ Recent posts