我不明白为什么它要查找 ID 而不是视图

I don't understand why it's looking for an ID instead of a view

我正试图到达某条路线,其中包含一个表格,但由于某种原因它正在寻找一个 ID。我将分享我的路线、我的观点和错误。

//celebrities routes 

const express = require('express');
const router = express.Router();
const Celeb = require('../model/celebrity.model')

router.get('/celebrities', (req, res) => {
    Celeb.find()
        .then(AlltheModels => {
            console.log(AlltheModels)
            res.render('celebrities/index', { celebs: AlltheModels })
        })
        .catch(error => console.log('error while getting the celebrities', error))
})

router.get('/celebrities/:id', (req, res) => {
    const celebId = req.params.id
    console.log(celebId)
    Celeb.findById(celebId)

        .then(OneCeleb => {
            console.log(OneCeleb)
            res.render('celebrities/show', { celebOne: OneCeleb })
        })

        .catch(error => console.log('there was an error by retrieving..', error))
})

//NEW celebrities

router.get('/celebrities/new', (req, res) => {

    res.render('celebrities/new')
})

router.post('/celebrities', (req, res) => {
    const { name, occupation, catchPhrase } = req.body;
    Celeb.create({ name, occupation, catchPhrase })
        // .then(CelebNew => {
        //      CelebNew.save()
        //  console.log(CelebNew + '...has been entered')
        // })
        .then(() => res.redirect('/celebrities'))
        .catch(error => `There was an error of ${error}`, err)
})

module.exports = router;

这是应该指向表单视图的视图

<div>
    <a href="/celebrities/new">Create a new Celebrity</a>
</div>


<div>
    {{#each celebs}}
    <a href="/celebrities/{{_id}}">
        <h2>{{this.name}}</h2>
    </a>
    {{/each}}
</div>

这是错误

"GET /celebrities/new - - 毫秒 - -

...检索时出错.. CastError:对于模型“Celeb”的路径“_id”处的值“new”,转换为 ObjectId 失败 在 model.Query.exec (/mnt/c/Users/carlo/documents/ironhack/labs/lab-mongoose-movies/starter-code/node_modules/mongoose/lib/query.js:4408:21)"

据我了解,问题出在这条路线上

router.get('/celebrities/:id', (req, res) => {
    const celebId = req.params.id
    console.log(celebId)
    Celeb.findById(celebId)

        .then(OneCeleb => {
            console.log(OneCeleb)
            res.render('celebrities/show', { OneCeleb })
        })

        .catch(error => console.log('there was an error by retrieving..', error))
})

但我不知道错误的原因或位置,或者为什么它试图寻找新的 Id,是车把助手吗?

您的问题是路径 /celebrities/new 与模式 /celebrities/:id 匹配。

当您向路径 /celebrities/new 发出 GET 请求时,Express 按顺序查找所有已注册的路由,试图找到匹配项。当 Express 找到注册的路由时,/celebrities/:id 它认为这是一个匹配,因为请求路径与模式匹配 - 它以“/celebrities/”开头,后跟一个任意字符串值,它解释为 id 参数(“新”)。

Express 永远不会为 /celebrities/new GET 路由提供服务,因为 /celebrities/:id 永远是第一个匹配项。

为了让 Express 找到 /celebrities/new 路线,必须在 /celebrities/:id 路线之前 注册它。您实际上只需要将 router.get('/celebrities/new'... 代码 移动到 router.get('/celebrities/:id',... 代码 上方。