Posts
Q&A
e.keyCode ์ง๋ฌธ
์๋ ํ์ธ์, Amen๋! keyCode ๊ธฐ๋ฅ์ ๋ ์ด์ ๊ถ์ฅ๋์ง ์์ต๋๋ค. ์ผ๋ถ ๋ธ๋ผ์ฐ์ ์์๋ ์ฌ์ ํ ๋์ํ ์ ์์ง๋ง, ์ด๋ฏธ ๊ด๋ จ ์น ํ์ค์์ ์ ๊ฑฐ๋์์ ์ ์์ผ๋ฉฐ ์ญ์ ๋๋ ๊ณผ์ ์ ์๊ฑฐ๋ ํธํ์ฑ ๋ชฉ์ ์ผ๋ก๋ง ๋ณด๊ดํ ๊ฒ์ ๋๋ค ์ฌ์ฉ์ ํผํ์๊ณ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ธฐ์กด ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ์ ์ผ ํฉ๋๋ค. duplicated๋ ๊ธฐ๋ฅ์ ๊ฐ๊ธ์ ์ผ๋ก ์ฌ์ฉํ์ง ์์ผ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋์ฒด์์ผ๋ก KeyboardEvent.code ๊ฐ ์ฌ์ฉ๋๋ค๊ณ ํฉ๋๋ค. keyCode ๋ฌธ์๋ ์ฌ๊ธฐ ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์. ๋์ฒด์์ธ KeyboardEvent.code ๋ฌธ์๋ ์ด ๊ณณ ์ ์ฐธ๊ณ ํด์ฃผ์๋ฉด ๋ฉ๋๋ค :) ๋ฐ์๋ ์์ ์ฝ๋์ ๋๋ค ! ์ฐธ๊ณ ํด์ฃผ์ธ์ . window.addEventListener("keydown", function(event) { if (event.defaultPrevented) { return; // Do nothing if event already handled } switch(event.code) { case "KeyS": case "ArrowDown": // Handle "back" updatePosition(-moveRate); break; case "KeyW": case "ArrowUp": // Handle "forward" updatePosition(moveRate); break; case "KeyA": case "ArrowLeft": // Handle "turn left" angle -= turnRate; break; case "KeyD": case "ArrowRight": // Handle "turn right" angle += turnRate; break; }
- 0
- 2
- 946
Q&A
๋ก๊ทธ์ธ userId๊ฐ ์ง๋ฌธ์ด์
์๋ ํ์ธ์, ์ด์ฝtv๋! (์ฌ์ง) ์์ ์ฝ๋๋ฅผ ๋ณด์๋ฉด, json์ผ๋ก ๋ฐํ๋๋ ๋ถ๋ถ์์ userId๊ฐ user._id๋ก ๋์ด์๋ ๊ฒ์ ๋ณด์ค ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ด์ฝtv๋์ด ์ฒ์์ ํ์๊ฐ์ ํ ๋ ์ ๋ ฅํ ์ ์ ์ id๊ฐ ์๋, mongoDB์์์ ์๋ณ์ _id์ ๋๋ค. ์ค์ ๋ก mongoDB์์ ๋ณธ์ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ธํด๋ณด๋ฉด, ์๋์ ๊ฐ์ด ๋์ต๋๋ค. (์ฌ์ง) ํ์๊ฐ์ ์์ ์ ๋ ฅํ ์ ์ ์ id๋ name์ผ๋ก ์ ์ฅ๋์ด์๊ณ , _id์ ObjectID("~~") ๋ถ๋ถ์ด ๋ณด์ด์คํ ๋ฐ์, ๋ฐ๋ก ์ด ๋ถ๋ถ์ json์์ ๋ฐํํด์ฃผ๋ ๊ฒ์ ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ธํด๋ณด๋ ๋ฐฉ๋ฒ์, ์ค์ต ์์ ๋ง๋์ ํด๋ฌ์คํฐ๋ฅผ ํด๋ฆญํด ๋ค์ด๊ฐ์ ํ (์ฌ์ง) Collections ํญ์ ๋ค์ด๊ฐ์๋ฉด ์ค์ต ์์ Postman์ผ๋ก ์ ๋ ฅํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ์ดํฐ๋ค์ด ๋ค์ด์์ต๋๋ค. ํน์ ๊ถ๊ธํ ์ ์์ผ์๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์. ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค :)
- 0
- 1
- 200
Q&A
toString()๋์ toHexString() ์ ์ฌ์ฉํ ์ด์ ๊ฐ ๊ถ๊ธํฉ๋๋ค~!!
์๋ ํ์ธ์, ๊น๋์ฑ๋! toHexString()์ ์ ์๋ ์๋์ ๊ฐ์ต๋๋ค. toHexString() Return the ObjectID id as a 24byte hex string representation. ํด์ํด๋ณด๋ฉด ObjectID ํํ์ id๋ฅผ 24๋ฐ์ดํธ์ hex ๋ฌธ์์ด๋ก ๋ฐ๊พธ์ด ๋ฆฌํดํด์ฃผ๋ ํจ์์ ๋๋ค. ์ฌ์ค, ์ฝ๋๋ฅผ ๋ฏ์ด๋ณด๋ฉด toString()์ toHexString()์ ๋ฆฌํดํฉ๋๋ค. (์ฌ์ง) ์์ ์ฌ์ง์ ๋ณด๋ฉด, toString์ด toHexString์ ๋ฐํํ๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ฆ, toString์ด toHexString์ ์์ ํจ์๋ก ๋ณผ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. (toString์ toHexString์ ๋ํํฉ๋๋ค.) ๊ฒฐ๊ตญ ํ์ฌ ํ๋ก์ ํธ ์ฝ๋์์ toHexString ๋ถ๋ถ์ toString์ผ๋ก ๋ฐ๊พธ์ด์ ์คํํด๋ ์ค๋ฅ๋ ๋ฐ์ํ์ง ์์ต๋๋ค. ์ ์๊ฐ์๋, MongoDB์์ ์ ๊ณตํ๊ณ ์๋ ์์ ์ฝ๋์์๋ toHexString์ผ๋ก ์ฌ์ฉํ๊ณ ์๊ณ , toString์ ํฌํจ๋์ด์ ๋ ์ข์ ์๋ฏธ์ ํจ์์ด๊ธฐ ๋๋ฌธ์ ์์ธ๋ฐ์๋ฅ ์ด ์ ์ด์ ์ฌ์ฉ๋๋ ๊ฒ์ด ์๋๊น ์ถ์ต๋๋ค. ๋ค๋ฅธ ์๊ฒฌ์ด ์๋ค๋ฉด, ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์. ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค :)
- 0
- 1
- 2.9K
Q&A
toHexString()์ด ์ ํํ ๋ฌด์จ ๋ฉ์๋์ด์ฃต?
์๋ ํ์ธ์, k0502s๋! ๊ฐ์์์ toHexString()์ ์ ์ฉํ๊ธฐ ์ ์ ๋ฐ์ํ ์๋ฌ๋ ์๋์ ๊ฐ์ต๋๋ค. Error: Expected "payload" to be a plain object. ํด์ํ์๋ฉด "payload"๊ฐ plain object ์ด์ด์ผ ํ๋ค๋ ๋ป์ ๋๋ค. ์ฆ, jwt.sign(payload, secretKey) ํจ์์์ payload๋ string ํ์์ด์ด์ผ ํฉ๋๋ค. ํ์ง๋ง, mongodb์์ ์์ฑ๋ user._id๋ก ์ฌ์ฉํ _id๋ string ํ์์ด ์๋๋๋ค. ๋ฐ๋ผ์ toHexString() ๋ฉ์๋๋ฅผ ํ์ฉํด์ ํ๋ณํ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค. toHexString() ๋ฉ์๋๋ ์๋์ ๊ฐ์ต๋๋ค. toHexString() Return the ObjectID id as a 24 byte hex string representation. ํด์ํด๋ณด๋ฉด ObjectID ํํ์ id๋ฅผ 24๋ฐ์ดํธ์ hex ๋ฌธ์์ด๋ก ๋ฐ๊พธ์ด ๋ฆฌํดํด์ฃผ๋ ํจ์์ ๋๋ค. ํน์ ๊ถ๊ธํ์ ์ ์ด ์๋ค๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์. ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. :)
- 1
- 1
- 754
Q&A
์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค ใ
์๋ ํ์ธ์, tlduf95๋! ์ฝ๋๋ฅผ ๋ณด๋ฉด, user.generateToken ๋ถ๋ถ if๋ฅผ ๋ด์ฃผ์ธ์. if (Err) ๋ผ๊ณ err์ ์คํ๊ฐ ๋ ๊ฒ ๊ฐ์ต๋๋ค. if (err) ๋ก ๋ณ๊ฒฝ ํ ๋ค์ Postman์ผ๋ก ํ์ธํด์ฃผ์๋ฉด ์ ์ ์๋ํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ ์ธ์ ๋ค๋ฅธ ์ฝ๋์๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ํน์, ๊ณ ์ณค์์๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์. ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค :)
- 0
- 1
- 534
Q&A
isModified ๋ถ๋ถ ์ง๋ฌธ์ ๋๋ฆฝ๋๋ค.
์๋ ํ์ธ์, Sounghyun Jeon๋! isModified() ๋ผ๋ ํจ์๋ mongoose ๋ชจ๋์ ํฌํจ๋์ด์๋ ํจ์์ ๋๋ค. ํ๋ผ๋ฏธํฐ๋ก ๋ค์ด์จ ๊ฐ์ด db์ ๊ธฐ๋ก๋ ๊ฐ๊ณผ ๋น๊ตํด์ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ๋ true๋ฅผ, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๋ false๋ฅผ ๋ฐํํ๋ ํจ์์ ๋๋ค. user ์์ฑ ์์๋ ํญ์ true์ด๋ฉฐ, user๊ฐ ์์ ๋๋ ๊ฒฝ์ฐ์๋ password๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ์๋ง true๋ฅผ ๋ฐํํฉ๋๋ค. user.password์ ๋ณ๊ฒฝ์ด ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์ด๋ฏธ ํด๋น ์์น์ hash๊ฐ ์ ์ฅ๋์ด์์ผ๋ฏ๋ก false๋ฅผ ๋ฐํํด ๋ค์ ์ํธํ๋ฅผ ํ์ง ์์ต๋๋ค. ํ์ฌ ์์ฑํ userSchema๊ฐ mongoose๋ฅผ ํ์ฉํด์ ์์ฑํ schema์ด๊ธฐ ๋๋ฌธ์ mongoose ๋ชจ๋์ ํฌํจ๋์ด์๋ isModified() ๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ์ดํดํ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ํน์ ๊ถ๊ธํ์ ์ ์ด ์๋ค๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์. ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. :)
- 1
- 1
- 1K
Q&A
์ง๋ฌธ ์์ต๋๋ค!
์๋ ํ์ธ์, sikK๋! User ๋ชจ๋ธ์ ๊ตฌ์ถํ ๋, ์ด๋ฉ์ผ์ unique๋ก ์ค์ ํ ๊ฒ์ ๊ธฐ์ตํ์ค๊ฒ๋๋ค. ๋ง์ฝ, ์ด๋ฉ์ผ์ด ๋ค๋ฅธ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๊ฐ ๋์ผํ ์ ์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์ด๋ฉ์ผ์ด ์ค๋ณต๋๋ค๋ฉด error ๋ฉ์ธ์ง๊ฐ json ์๋ต์ผ๋ก ๋์ด์ต๋๋ค. (์ฌ์ง) ์์ ์ฌ์ง์ ์ ๊ฐ Postman์์ ์ด๋ฉ์ผ์ด ์ค๋ณต๋๋ ์ ์ ๋ฅผ postํ์ ๋ ๋ฐ์ ์๋ฌ๋ฉ์ธ์ง์ ๋๋ค. ๋ฐ๋ผ์, ์ด๋ฏธ ๊ฐ์ ํ ์ฌ๋์ด ํ์๊ฐ์ ์ ํ๋ ค๊ณ ํ ์์๋ Client๋ก ํ์๊ฐ์ ์ฑ๊ณต ์ฌ๋ถ๊ฐ false๋ก ์ ๋ฌ๋๊ณ ์๋ฌ ๋ฉ์ธ์ง๊น์ง ์ ๋ฌ๋ฉ๋๋ค. ๋ง์ฝ sikK๋๊ป์ ์ด๋ฆ๋ uniqueํ๊ฒ ์ค์ ํ๊ณ ์ถ๋ค๋ฉด, ๋ชจ๋ธ ํ์ผ์ธ User.js์์ unique ์ค์ ์ ์ถ๊ฐํด์ฃผ์๋ฉด ๋ฉ๋๋ค. ํน์ ๊ถ๊ธํ์ ์ ์ด ์๋ค๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์. ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. :)
- 0
- 1
- 209
Q&A
IP๋ ์ค์ ํ๊ณ ๋ค ํด๋ดค๋๋ฐ ์ค๋ฅ๊ฐ ๊ณ์๋ฐ์ํฉ๋๋ค
์๋ ํ์ธ์, rnrneks150๋! MongoParserError: Invalid connection string ์์ ์๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก url์ ์คํ๊ฐ ์๊ฑฐ๋, ์๋ชป ์ ์ผ์ จ์ ๋ ๋ฐ์ํ๋ ์๋ฌ์ ๋๋ค. rnrneks150๋์ด ์ ๋ ฅํด์ฃผ์ mongoose.connection() ๋ถ๋ถ์ url ๋ถ๋ถ์ username์ด ์ด๊ธฐ์ ์ค์ ํ์ username๊ณผ ๋์ผํ์ง ํ์ธํด์ฃผ์ธ์. username๊ณผ password๊ฐ ํ๋ฆฌ์ง ์์์๋ ๊ณ์ ์๋ฌ๊ฐ ๋ฌ๋ค๋ฉด, username ์๋ถ๋ถ์ mongodb๋ผ๋ ์ฒ ์๊ฐ ๋ฐ๋ฅธ์ง ํ์ธํด์ฃผ์ธ์. ๋ฐ๋ก ์ฝ๋๊ฐ ์ฒจ๋ถ๋์ด์์ง ์์์ ์ ํํ๊ฒ ๋์๋๋ฆฌ์ง ๋ชปํ๋ ์ ์ํด ๋ถํ๋๋ฆฝ๋๋ค. ๊ณ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ค๋ฉด, mongoDB์์ ์ ๊ณตํ๋ ์์ ๋ฅผ ๋ฐ๋ผํ๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค. const MongoClient = require('mongodb').MongoClient; const uri = "mongodb+srv://username:password@cluster0.lmq5s.mongodb.net/DBname?retryWrites=true&w=majority"; const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); client.connect(err => { const collection = client.db("test").collection("devices"); // perform actions on the collection object client.close(); }); ์์ ์ฝ๋ ๋ด์ฉ์ด mongoDB์์ ์ ๊ณตํ๋ ์์ ์ฝ๋์ ๋๋ค. uri ๋ถ๋ถ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ ๋ถ๋ถ๋ค์ ๋ฐ๊พธ์ด์ ์๋ํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ํน์ ๊ถ๊ธํ์ ์ ์ด ์๋ค๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์. ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. :)
- 0
- 1
- 275
Q&A
๋น์ฃผ์ผ ์คํ๋์ค
์๋ ํ์ธ์, sans4976 ๋! WARNING: You are using pip version 20.2.3; however, version 21.0.1 is available. ํด๋น ๋ถ๋ถ์ ๋ณด๋, pip ๋ฒ์ ์ด 21.0.1์ด ํ์ํ๋ฐ ํ์ฌ ์ง๋ฌธ์๋ถ pip ๋ฒ์ ์ 20.2.3 ์ด๋ผ์ ๋ฐ์ํ ์ค๋ฅ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์, pip ๋ฒ์ ์ ์ ๊ทธ๋ ์ด๋ ํด์ฃผ์๋ฉด ์๋ฌ๊ฐ ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฆฌ๋ ์ค ํ๊ฒฝ์์ pip ์ ๋ฐ์ดํธ pip install --upgrade pip ์๋์ฐ ํ๊ฒฝ์์ pip ์ ๋ฐ์ดํธ python -m pip install --upgrade pip pip ๋ฒ์ ํ์ธ pip --version ์์ ๋ช ๋ น์ด๋ฅผ ํ์ฉํด์ pip๋ฅผ ์ ๋ฐ์ดํธ ํด์ฃผ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค! ํน์ ๊ถ๊ธํ์ ์ ์ด ์๋ค๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์. ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. :)
- 0
- 1
- 332
Q&A
์ต๋ ๋ถ๋ถ ์ฆ๊ฐ์์ด max(dy)๊ฐ ์๋๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์๋ ํ์ธ์, wndud๋! ์ฐ์ ํด๋น ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ด์ ๋ ํ์ด์ฌ ์์ฝ์ด๋ฅผ ๋ณ์๋ช ์ผ๋ก ์ฌ์ฉํ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฌํ ์์ฝ์ด๋ค์ ๊ฐ๊ฐ์ ๊ธฐ๋ฅ๋ค์ด ์๋ ํจ์์ด๊ธฐ ๋๋ฌธ์, ๋ณ์๋ช ์ผ๋ก ์ฌ์ฉํ๊ฒ๋๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ํ์ฌ wndud๋์ด ์์ฑํด์ฃผ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด max๋ฅผ ๋ณ์๋ช ์ผ๋ก ์ฌ์ฉํ ํ์ max() ํจ์๋ฅผ ๋ค์ ์ฌ์ฉํด ์ด๋ฆ ์ค๋ณต์ผ๋ก ์ธํด ํด๋น ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ณ์๋ช ์ max๊ฐ ์๋ ๋ค๋ฅธ ๋ณ์๋ก ๋ฐ๊ฟ์ค ํ์ max() ํจ์๋ฅผ ๋ค์ print ํด๋ณด์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋, ํด๋น ๋ณ์๋ช ์ ์ฌ์ฉํ ํ์ max() ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ์ del ๋ณ์๋ช ์ ์ฌ์ฉํด ๋ณ์๋ฅผ ์ง์์ฃผ๋ ํํ๋ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค. ํน์ ๊ถ๊ธํ์ ์ ์ด ์๋ค๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์. ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. :)
- 0
- 1
- 285