JJoriping / KKuTu

글자로 놀자! 끄투 온라인
http://jjo.kr/kkutu
GNU General Public License v3.0
328 stars 267 forks source link

불러오는 중 1..에서 멈춥니다. #1039

Closed june2007 closed 2 years ago

june2007 commented 2 years ago

끄투 매니저에는

[2022-08-14 15:36:20] ERROR OCCURRED ON THE MASTER! :8100 [2022-8-14 3:36:20 ├F10: PM┤] ERROR: TypeError: Cannot read property 'replace' of undefined TypeError: Cannot read property 'replace' of undefined at C:\Users*\Desktop\KKuTu-master\Server\lib\Game\master.js:444:51 at exports.Tail.go (C:\Users*\Desktop\KKuTu-master\Server\lib\sub\lizard.js:43:16) at C:\Users*\Desktop\KKuTu-master\Server\lib\Game\kkutu.js:470:11 at callback (C:\Users*\Desktop\KKuTu-master\Server\lib\sub\collection.js:316:13) at Result.preCB (C:\Users*\Desktop\KKuTu-master\Server\lib\sub\collection.js:298:6) at Result.Query.handleReadyForQuery (C:\Users*\Desktop\KKuTu-master\Server\lib\node_modules\pg\lib\query.js:144:10) at Connection.<anonymous> (C:\Users*\Desktop\KKuTu-master\Server\lib\node_modules\pg\lib\client.js:180:19) at Connection.emit (events.js:314:20) at Socket.<anonymous> (C:\Users*\Desktop\KKuTu-master\Server\lib\node_modules\pg\lib\connection.js:133:12) at Socket.emit (events.js:314:20)

라고 뜨네요 ***는 제 실명 이어서 가린것입니다

lshqqytiger commented 2 years ago

어떤 소셜 로그인 방식(Strategy)으로 로그인하셨나요?

june2007 commented 2 years ago

디스코드로 로그인 했스비다

lshqqytiger commented 2 years ago

$c.profile.title이 falsy고 $c.profile.nameundefined인 상황인데 auth_discord.js의 module.exports.config.scope 값이 "identify"로 되어있는지 확인해보세요. module.exports.config.scope 값이 "identify"로 되어있다면 디스코드에서 그렇게 응답했을 것 같지는 않고 로그인 과정에서 문제가 있었던 것 같습니다. 그런 증상이 반복되면 auth_discord.js에서 디스코드에서 어떻게 응답했는지 확인이 필요합니다.

june2007 commented 2 years ago

auth_discord.js 에는

const config = require('../../sub/auth.json');

module.exports.config = {
    strategy: require('passport-discord').Strategy,
    color: '#7289DA',
    fontColor: '#FFFFFF',
    vendor: 'discord',
    displayName: 'withDiscord'
}

module.exports.strategyConfig = {
    clientID: config.discord.clientID,
    clientSecret: config.discord.clientSecret,
    callbackURL: config.discord.callbackURL,
    passReqToCallback: true,
    scope: "identify"
}

module.exports.strategy = (process, MainDB, Ajae) => {
    return (req, accessToken, refreshToken, profile, done) => {
        const $p = {};

        // var fullname = profile.username+"#"+profile.discriminator;

        $p.authType = "discord";
        $p.id = $p.authType+"-"+profile.id;
        $p.name = profile.username;
        $p.title = profile.username;
        $p.image = `https://cdn.discordapp.com/avatars/${profile.id}/${profile.avatar}.png`;

        process(req, accessToken, MainDB, $p, done);
    }
}

라고 코드가 있습니다

lshqqytiger commented 2 years ago

const $p = {};$p.authType = "discord"; 사이에 console.log(profile);을 추가해서 profile 값을 확인해보세요. 화면 캡처 2022-08-19 223051 객체에 username 키가 있어야 합니다.

june2007 commented 2 years ago

혹시

module.exports.strategy = (process, MainDB, Ajae) => {
    return (req, accessToken, refreshToken, profile, done) => {
        const $p = {};

        // var fullname = profile.username+"#"+profile.discriminator;
        console.log(profile);

        $p.authType = "discord";
        $p.id = $p.authType+"-"+profile.id;
        $p.name = profile.username;
        $p.title = profile.username;
        $p.image = `https://cdn.discordapp.com/avatars/${profile.id}/${profile.avatar}.png`;

        process(req, accessToken, MainDB, $p, done);
    }
}

이런식으로 하는게 맞나요? 저렇게 해도 안돼서 일단 콘솔에 console.log(profile); 이라고 적고 보긴 했는데

<span id="profile">
    "{"authType":"discord","id":"discord-907964469412511815","image":"https://cdn.discordapp.com/avatars/907964469412511815/null.png","token":"XsQ4YzDng12UwNlFhyPIwx8EqPUEIm","sid":"KnFBcphB1_uGvN504vZcZ0M47eJFjbY5"}"
</span>

라고 나오네요

lshqqytiger commented 2 years ago

프론트엔드의 global.profile 변수가 가리키는 객체는 세션의 profile 객체를 stringify한 값을 innerHTML로 가지고 있는 span 요소이기 때문에 console.log(profile);을 통해 디버깅하고 싶었던 profile 객체가 아니고 $p 객체입니다. auth_discord.jsmain.js에서 require하는 login.js에서 require하므로 auth_discord.js에서 console.log 함수를 호출하면 웹 서버(Node.js) 로그에 기록됩니다. (KKuTu Server Manager를 사용하는 경우 KKuTu Server Manager에 기록) package.jsondependencies 안에 passport-discord 값이 어떻게 되어있나요? 화면 캡처 2022-08-20 180608 그리고 로그인 시 위 사진처럼 사용자명, 아바타, 배너 보기가 있는지 확인해보세요.

june2007 commented 2 years ago

"passport-discord": "^0.1.4",

라고 적혀있네요 그리고 사용자명, 아바타, 배너 보기는 다 있습니다

lshqqytiger commented 2 years ago

npm i passport-discord@0.1.3 또는 yarn add passport-discord@0.1.3 입력 후 서버 재부팅해보세요.

june2007 commented 2 years ago

cmd에 npm i passport-discord@0.1.3 라고 해봤는데

npm WARN saveError ENOENT: no such file or directory, open 'C:\Users\김지훈\package.json'
npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\김지훈\package.json'
npm WARN (실명) No description
npm WARN (실명)No repository field.
npm WARN (실명) No README data
npm WARN (실명) No license field.

+ passport-discord@0.1.3
updated 1 package and audited 11 packages in 0.437s

1 package is looking for funding
  run `npm fund` for details

found 0 vulnerabilities

라고 뜹니다

그리고 로그인 하면 메인페이지에 위에 파란 바 같은거에 홈 게임 갤러리 그리고 로그인한 계정 이름이 떠야하잖아요 근데 그게 안뜹니다

lshqqytiger commented 2 years ago

kkutu-core 패키지에 대해서 실행해야 합니다. (다운로드 받은 레포지토리 폴더/Server/lib로 이동 후 실행) 계정 이름이 뜨지 않는 것은 SESSION.profile 객체에 title 키와 name 키가 누락(undefined)되었기 때문입니다.

june2007 commented 2 years ago

명령어 :

cd C:\Users\(실명)\Desktop\KKuTu-master\Server\lib
npm i passport-discord@0.1.3`

결과 :

 npm WARN deprecated querystring@0.2.1: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
+ passport-discord@0.1.3
added 4 packages from 59 contributors, updated 1 package and audited 293 packages in 1.992s
found 38 vulnerabilities (1 low, 17 moderate, 16 high, 4 critical)
  run `npm audit fix` to fix them, or `npm audit` for details

이렇게입니다

lshqqytiger commented 2 years ago

이제 다시 로그인해보세요.

june2007 commented 2 years ago

음... 해결 되지 않았습니다. 혹시 최근에 이름 바꾸는 기능 PR에서 받았는데 그거 때문일까요?

lshqqytiger commented 2 years ago

그렇다면 확인을 해봐야 할 것 같은데 디스코드로 가능하실까요?

june2007 commented 2 years ago

디스코드 가능합니다

lshqqytiger commented 2 years ago

-로 연락해주세요. 데이터베이스 쪽도 확인이 필요해보여서

lshqqytiger commented 2 years ago

해결되었습니다. 데이터베이스에 이미 유저 정보가 기록된 이후에 PR 내용을 적용하여 firstfalse인 기존 유저의 username 값이 nickname 컬럼에 반영되지 못해 nickname 값이 계속 NULL로 유지되어 발생하는 문제였습니다. nickname 컬럼에 값을 직접 입력해주거나 DELETE FROM users;first 값이 true가 되도록 해주면 해결됩니다.

june2007 commented 2 years ago

감사합니다 해결 됐습니다. 이슈 닫을게요