Express报错Route.get()需回调函数,排查/EmpDeleteAll端点问题
错误原因分析
- 错误调用Router实例:你在
index.js里写了const EmpFunction = require('./controllers/emp.controller')();,但emp.controller.js导出的是express的Router实例,不是可执行函数,加()调用完全没必要,还会导致后续无法获取到预期的方法。 - 导出与导入不匹配:
emp.controller里用exports.deleteAll定义了方法,但最后导出的是router,外部导入后根本拿不到deleteAll属性,所以funcObject.deleteAll是undefined,express路由方法要求必须传有效回调,自然就报错了。
解决方案
给你两种可行方案,按需选择:
方案一:直接导出控制器方法(不用Router)
修改emp.controller.js,直接导出包含方法的对象:
const db = require("../models"); const Employee = db.employee; // 删除所有员工 const deleteAll = (req, res) => { Employee.deleteMany({}) .then(data => { res.send({ message: `${data.deletedCount} 名员工已成功删除!` }); }) .catch(err => { res.status(500).send({ message: err.message || "删除所有员工时发生未知错误。" }); }); }; module.exports = { deleteAll };
然后修正index.js的导入语句,去掉多余的():
// 去掉末尾的() const EmpFunction = require('./controllers/emp.controller'); const functions = [ { name: "Emp", function: EmpFunction } ];
方案二:用Router挂载路由(更规范的Express写法)
如果想保留Router,调整emp.controller.js,把接口挂载到Router上:
const db = require("../models"); const Employee = db.employee; const express = require('express'); const router = express.Router(); // 删除所有员工的接口 router.post('/EmpDeleteAll', (req, res) => { Employee.deleteMany({}) .then(data => { res.send({ message: `${data.deletedCount} 名员工已成功删除!` }); }) .catch(err => { res.status(500).send({ message: err.message || "删除所有员工时发生未知错误。" }); }); }); module.exports = router;
再修改index.js,直接挂载这个Router,删掉原来的functions循环:
const empRouter = require('./controllers/emp.controller'); // 把控制器的路由挂载到主app上 app.use('/', empRouter);
这样/EmpDeleteAll端点就能正常工作了。
内容的提问来源于stack exchange,提问作者nyla L
相关产品推荐
相关产品推荐

