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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:10:30