SeoMiYoung / CA_nodedotjs_mongodb

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[BUG] BSON Error

SeoMiYoung opened this issue ยท comments

๐Ÿ”ถ ์—๋Ÿฌ ๋ฌธ๊ตฌ

image

[์—๋Ÿฌ ๋ฐœ์ƒ ์ฝ”๋“œ]
new ObjectId(์š”์ฒญ.params.id) => ์ด ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ ๋ฐœ์ƒ

app.get('/detail/:id', async(์š”์ฒญ, ์‘๋‹ต) => {
    try {
        // collection์— ์žˆ๋Š” ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ document๋งŒ ๊ฐ€์ ธ์™€์ฃผ์„ธ์š”.
        let result = await db.collection('shopData').findOne({ _id : new ObjectId(์š”์ฒญ.params.id)})
        console.log(result)
        ์‘๋‹ต.render('detail.ejs', {result: result})
    } catch(e) {
        // ์—๋Ÿฌ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
        console.log(e)
        // ๊ทธ๋ƒฅ ์‘๋‹ต.sendํ•ด์ค˜๋„ ๋˜๊ธดํ•œ๋ฐ, status์“ฐ๋ฉด user๊ฐ€ ์–ด๋–ค ๋ฌธ์ œ์ธ์ง€ ์ž˜ ํŒŒ์•… ๊ฐ€๋Šฅ
           // status(5**): ์„œ๋ฒ„๋ฌธ์ œ์ž„
           // status(4**): user๋ฌธ์ œ์ž„
        ์‘๋‹ต.status(404).send('url์ด ์ด์ƒํ•ด์„œ ์—๋Ÿฌ ๋ฐœ์ƒ')
    }
})

๐Ÿ”ถ ์˜ค๋ฅ˜ ์›์ธ

ํ•ด๋‹น ์—๋Ÿฌ๋Š” MongoDB์—์„œ ๊ฐ์ฒด ID(ObjectId)๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋กœ, ์ฃผ์–ด์ง„ ์ธ์ž๊ฐ€ 12๋ฐ”์ดํŠธ ๊ธธ์ด์˜ ๋ฌธ์ž์—ด, 24๊ฐœ์˜ 16์ง„์ˆ˜ ๋ฌธ์ž๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด, ๋˜๋Š” ์ •์ˆ˜์—ฌ์•ผํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์˜ ์ธ์ž๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ์›์ธ์€ 2๊ฐ€์ง€๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(1) ์ž˜๋ชป๋œ ํ˜•์‹์˜ ID์‚ฌ์šฉ

MongoDB ObjectId๋Š” 12๋ฐ”์ดํŠธ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๊ฐ’ ๋˜๋Š” 24์ž๋ฆฌ์˜ 16์ง„์ˆ˜ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด ํ˜•์‹์„ ๋”ฐ๋ฅด์ง€ ์•Š๋Š” ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

(2) ๋นˆ ๋ฌธ์ž์—ด ๋˜๋Š” null๊ฐ’ ์ „๋‹ฌ

ObjectId ์ƒ์„ฑ ์‹œ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’์ด ์ „๋‹ฌ๋œ ๊ฒฝ์šฐ์— ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฆ‰, ๊ธธ์ด๋‚˜ ๊ตฌ์„ฑ ํ˜•์‹์€ ๋งž์ท„์œผ๋‚˜, ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” id๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” null์ด ์ „๋‹ฌ๋˜์„œ, ๋‹ค์Œ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด null(result์—)์ด ๋“ค์–ด์™€์„œ dot์œผ๋กœ title๊ณผ ๊ฐ™์€ ๊ฒƒ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋œน๋‹ˆ๋‹ค.
image

๐Ÿ”ถ ํ•ด๊ฒฐ

if/else๋ฌธ์œผ๋กœ null์ด ๋“ค์–ด์™”์„๋•Œ๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ์—ˆ๋‹ค.

app.get('/detail/:id', async(์š”์ฒญ, ์‘๋‹ต) => {
    try {
        // collection์— ์žˆ๋Š” ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ document๋งŒ ๊ฐ€์ ธ์™€์ฃผ์„ธ์š”.
        let result = await db.collection('shopData').findOne({ _id : new ObjectId(์š”์ฒญ.params.id)})
        console.log(result)
        if (result == null) {
            ์‘๋‹ต.status(404).send('url์— ํ•ด๋‹นํ•˜๋Š” id์—†์Œ')
        }
        else {
            ์‘๋‹ต.render('detail.ejs', {result: result})
        }
    } catch(e) {
        // ์—๋Ÿฌ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
        console.log(e)
        // ๊ทธ๋ƒฅ ์‘๋‹ต.sendํ•ด์ค˜๋„ ๋˜๊ธดํ•œ๋ฐ, status์“ฐ๋ฉด user๊ฐ€ ์–ด๋–ค ๋ฌธ์ œ์ธ์ง€ ์ž˜ ํŒŒ์•… ๊ฐ€๋Šฅ
           // status(5**): ์„œ๋ฒ„๋ฌธ์ œ์ž„
           // status(4**): user๋ฌธ์ œ์ž„
        ์‘๋‹ต.status(404).send('url์ด ์ด์ƒํ•ด์„œ ์—๋Ÿฌ ๋ฐœ์ƒ')
    }
})