You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:54:02