Express项目Cannot POST /search报错,searchRouter问题排查求助
问题原因与修复方案
1. 核心错误:请求方法不匹配
你当前在searchRouter中只定义了GET方法的/search路由,而前端提交的是POST请求,Express找不到对应POST路由就会抛出Cannot POST /search报错。
修复方式:将路由定义的get改为post:
// 修正前 router.get('/search',(req,res) =>{ // 修正后 router.post('/search',(req,res) =>{
2. 隐含问题1:参数获取逻辑错误
如果继续用GET方式处理搜索请求,参数是存储在req.query而非req.body中的,会导致拿不到搜索词的问题。修改为POST路由后,req.body可以正常拿到表单提交的参数。
3. 隐含问题2:SQL语句语法错误 + 注入风险
你当前的SQL语句存在引号配对错误,且直接拼接用户输入存在严重SQL注入风险,同时模糊匹配需要加%通配符才能实现关键词搜索,建议改用参数化查询写法:
// 修正后的查询逻辑 const searched = req.body.search // 使用?作为参数占位符 const query = 'SELECT * FROM memes WHERE title LIKE ? OR user LIKE ?' // 参数按顺序传入数组,前后加%实现模糊匹配 dbCon.query(query, [`%${searched}%`, `%${searched}%`], (err, results) =>{ if(err) { console.log(err) // 新增错误返回逻辑,避免页面挂起 return res.status(500).send('搜索失败') } console.log(results) res.render('detail',{memes:results}) })
补充:如果需要支持搜索结果页分享,更推荐用GET请求实现搜索,只需把前端表单的
method属性改为get,路由保持router.get('/search'),同时参数获取改为const searched = req.query.search即可。
修正后完整的searchRouter代码
const express = require('express') const router = express.Router() const dbCon = require('../database.js') router.post('/search',(req,res) =>{ const searched = req.body.search const query = 'SELECT * FROM memes WHERE title LIKE ? OR user LIKE ?' dbCon.query(query, [`%${searched}%`, `%${searched}%`], (err, results) =>{ if(err) { console.log(err) return res.status(500).send('搜索出错') } console.log(results) res.render('detail',{memes:results}) }) }) module.exports = router
内容的提问来源于stack exchange,提问作者gjqeriqi
相关产品推荐
相关产品推荐

