Express中Route.get()报错:需回调函数却获Promise的问题排查修复
问题修复:Express路由报错Error: Route.get() requires a callback function but got a [object Promise]
核心错误点及修复步骤
1. 路由中错误执行了控制器函数
在route/players.js里,你直接调用了getAllPlayers(),这会立即执行函数并返回一个Promise,但Express路由需要的是函数引用,不是执行结果。
错误代码:
router.get('/players', playerControll.getAllPlayers());
修复后:
router.get('/players', playerControll.getAllPlayers);
2. 路由挂载时未正确引用导出的router对象
在server.js中,playerRoutes导出的是包含routes属性的对象,所以挂载时要指定playerRoutes.routes,否则Express无法识别路由。
错误代码:
app.use('/api/v1', playerRoutes);
修复后:
app.use('/api/v1', playerRoutes.routes);
3. 控制器函数的异步逻辑优化
你的getAllPlayers声明为async函数,但内部用的是回调式的sql操作,既没有利用async/await的优势,还存在错误:
- catch块里用了
error.message,但参数是err,会导致未定义错误 - sql.connect出错时,只打印日志但没有给客户端返回响应,会造成请求挂起
优化后的controller.js:
const { sql, config } = require('../database/db'); const getAllPlayers = async (req, res, next) => { try { // 改用async/await方式连接数据库,避免回调嵌套 await sql.connect(config); const request = new sql.Request(); const recordset = await request.query("select * from players"); res.send(recordset); } catch (err) { console.error("数据库操作出错:", err); res.status(500).send({ error: err.message }); } }; module.exports = { getAllPlayers };
验证修复
完成以上修改后,重启服务器,访问localhost:3200/api/v1/players就能正常获取数据了。
内容的提问来源于stack exchange,提问作者Prabir Choudhury
相关产品推荐
相关产品推荐

