Node.js中导出函数无法执行问题求助:AllCategories函数未触发运行的原因排查
问题分析与解决方案
首先,最核心的问题是你并没有执行AllCategories函数,只是引用了函数本身。在控制器的getCategories方法里,你写的是:
const categoriesInfo = categoryService.AllCategories
这里的categoryService.AllCategories是函数的引用,不是执行函数后的结果——就像你拿着一把钥匙却没去开门,自然不会有任何实际动作发生。你需要加上括号来触发函数执行:categoryService.AllCategories()。
其次,因为你后来把AllCategories改成了async函数,它执行后会返回一个Promise对象,所以在控制器里必须用await来等待异步操作完成,否则你拿到的只是一个未完成的Promise,而不是实际的分类数据。
修正后的控制器代码
import express from 'express'; import categoryService from '../services/categories.js' const router = express.Router(); export const getCategories = async(req,res) => { try { // 执行函数并等待异步结果返回 const categoriesInfo = await categoryService.AllCategories() res.status(200).json(categoriesInfo) } catch (error) { res.status(404).json({ message: error.message }); } } export default router;
额外优化建议
你的AllCategories函数里,catch块直接返回错误的做法不是最佳实践,建议抛出错误让上层的try/catch统一处理,这样控制器的catch逻辑能更清晰地捕获并返回响应:
import Category from '../models/Category.js'; export const AllCategories = async () => { try { console.log("hit"); const cursor = await Category.find({}); console.log(cursor); return cursor } catch (error) { // 抛出错误,交给控制器的catch处理 throw new Error(`获取分类失败: ${error.message}`); } } export default {AllCategories}
这样修改后,你的函数就能被正确执行,并且能把MongoDB查询到的分类数据正常返回给前端了。
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

