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

Express搜索路由报Route.get()回调函数为Undefined错误排查

报错排查及修复方案

你当前触发的Route.get() requires a callback function but got a [object Undefined]错误,以及代码中存在的其他功能异常问题,修复点如下:

  • 直接触发路由报错的根因:控制器导出语法错误,CommonJS规范下正确导出关键字为module.exports,你写的module.export少了末尾的s,导致路由文件引入控制器时拿到空对象,SearchController.searchLimit为undefined,不满足Express路由对回调函数的要求。
  • 缺失Sequelize运算符导入:代码中使用了模糊查询运算符Op.like但未提前引入,运行查询时会报Op is not defined错误。
  • 常量非法赋值:用const声明的keywords属于常量,后续执行keywords = keywords.toLowerCase()会触发类型错误,需改用新变量存储格式化后的关键词,或用let声明变量。
  • 查询变量名不匹配:模糊查询拼接时使用了未定义的变量term,实际你从query中拿到的参数名为keywords,会触发变量未定义错误。
  • Sequelize查询参数传错:findAll方法仅接收一个配置对象参数,你将limit单独作为第二个参数传入是无效的,需要将limit和where配置放在同一个对象中。
  • 响应方法使用错误:Express的res.send()不支持第二个传参,返回结构化JSON数据需使用res.json()方法。
  • 日志拼写错误:catch块中coneole.log(err)拼写错误,异常发生时无法正常打印日志。
  • 缺失边界判断:未处理请求中未携带keywords参数的情况,直接调用toLowerCase()会触发空值报错。

注意:如果你的商品表没有名为keywords的字段,需要将查询条件中的字段名替换为实际存储可搜索内容的字段(如商品标题title、商品名name等),否则会触发SQL字段不存在错误。

修复后完整代码

控制器文件(../controllers/search.js)

const Product = require("../models/Product");
// 补全Sequelize Op运算符导入
const { Op } = require("sequelize");

const searchLimit = async (req, res) => {
  try {
    const { keywords } = req.query;
    // 新增空参数边界判断
    if (!keywords) {
      return res.status(400).json({ code: 400, msg: "搜索关键词不能为空" });
    }
    // 用新变量存储格式化后的关键词,避免给const常量赋值
    const formatKeyword = keywords.toLowerCase();
    // 统一用await处理异步,把limit放到查询配置对象内,修正变量名
    const output = await Product.findAll({
      where: {
        keywords: {
          [Op.like]: `%${formatKeyword}%`
        }
      },
      limit: 5
    });
    // 用res.json返回结构化响应
    return res.json({ msg: "search result", output });
  } catch (err) {
    // 修正console拼写
    console.log(err);
    return res.status(500).json({ code: 500, msg: "搜索服务异常", error: err.message });
  }
};

// 修正导出语法,补全exports末尾的s
module.exports = { searchLimit };

路由文件

const express = require("express");
// 确认路由实例正确初始化
const route = express.Router();
const SearchController = require("../controllers/search");

route.get("/search/limit", SearchController.searchLimit);

module.exports = route;

内容的提问来源于stack exchange,提问作者Rogestav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:01:05