我有一个node.js应用程序。当网页第一次呈现时,所有工作如预期,但当检查应用程序崩溃时,req.params.slug显示为requestProvider.js.map.
router.get('/:slug', async (req, res) => {
const article = await Article.findOne({ slug: req.params.slug })
if (article == null){
res.render('/')
}
res.render('articles/show', { article: article })
})
编辑使用Console.Log Messages
router.get('/:slug', async (req, res) => {
console.log("slug")
console.log(req.params)
const article = await Article.findOne({ slug: req.params.slug })
console.log("article")
console.log(article)
if (article == null){
res.render('/')
}
console.log("article")
console.log(article)
console.log("title")
console.log(article.title)
res.render('articles/show', { article: article })
})
控制台消息为
蛞蝓{slug: 'requestProvider.js。地图的}文章零文章零标题C:UserssamueOneDriveDesktopshortcuts and unused unused 2Blogpublicroutesarticles.js:32console.log (article.title)^
TypeError: Cannot read properties of null (reading 'title') users samue onedrive desktop shortcuts unused unused 2Blogpublicroutesarticles.js:32:23在processTicksAndRejections(节点:内部/进程/task_queues:96:5)[nodemon]应用程序崩溃-在启动前等待文件更改…
您面临的问题是,您对article的null检查实际上并没有结束函数过程,因此稍后当您调用article时。它抛出的标题未定义。您可以通过在响应前添加return来解决这个问题。
if (article == null) return res.render('/')
或使用可选的链接
console.log(article?.title)
总的来说,你应该尝试重构端点,我建议:
router.get('/:slug', async (req, res) => {
const { slug } = req.params // destructure slug from params
if (!slug) return res.render('/') // check if provided
try {
const article = await Article.findOne({ slug })
return res.render('articles/show', { article })
} catch(err) {
res.status(400) // or some other error repsonse
return res.render('your error page')
}
})
注意:这是未经测试的
当我使用Remix并了解到当您打开Chrome Developer工具时,也会发生这种情况对于你的网页:https://github.com/vercel/next.js/discussions/35199?sort=top(这是Next.js的例子),所以你必须异常处理requestProvider.js.map
被传递到你的url,并避免它。