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
相关产品推荐
相关产品推荐

