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

Express食谱搜索后端启动报错:Route.get()需回调函数却获[object Undefined]

解决Route.get() requires a callback function but got a [object Undefined]错误

你遇到的这个错误核心原因是:你传给路由的回调函数中有一个是undefined,具体来说是控制器的导出与导入语法不匹配导致的。

问题定位

看你的代码:

  • 控制器文件最后用了ES模块的导出语法:export default recipesController;
  • 但路由文件里用了CommonJS的导入语法:const recipesController = require('../controllers/recipes-controller')

在Node.js中,当用require()导入一个用export default导出的模块时,导入的结果是一个对象,真实的控制器对象在这个对象的.default属性里。这就导致recipesController.sendApiRecipe、recipesController.create这些方法全都是undefined,触发了Route.get()的错误。

解决方案

你有两种方式来修复,选一种和项目整体风格一致的即可:

方案1:将控制器改为CommonJS导出

把控制器文件的最后一行:

export default recipesController;

替换成:

module.exports = recipesController;

方案2:将路由改为ES模块导入

如果你的项目配置支持ES模块(需要在package.json中添加"type": "module"),可以把路由里的导入语句改成:

import recipesController from '../controllers/recipes-controller.js';

额外优化建议

另外看你的工具函数getRecipes,目前没有处理API请求失败的情况,如果fetch请求出错(比如网络问题、API返回错误状态码),会导致请求挂起,建议加上错误处理:

function getRecipes(req, res, next) {
  fetch(`https://api.edamam.com/search?q=${req.params.search}&app_id=${process.env.APP_ID}&app_key=${process.env.APP_KEY}&from=0&to=30`)
    .then(res => {
      // 检查API是否返回成功状态
      if (!res.ok) throw new Error(`API request failed with status ${res.status}`);
      return res.json();
    })
    .then(fetchRes => {
      res.locals.recipe = fetchRes
      next()
    })
    .catch(err => {
      // 将错误传递给Express的错误处理中间件
      next(err);
    })
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:48:29