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

