Express在异步函数内创建路由不生效的原因是什么?
问题根本原因
你遇到的问题本质不是「Express不支持在异步函数中创建路由」,而是路由注册的时机晚于app.listen启动服务的时机。
Express的路由匹配规则是在服务启动时初始化的,如果你先执行app.listen启动服务,后续再通过app.get等方法注册的路由不会被纳入匹配规则,自然访问时不会生效。
你代码中databaseConnection内部包含await mongoose.connect异步操作,会被挂起到事件循环等待执行,如果你把app.listen代码写在了databaseConnection(apiRoutes, app)调用的后方,同步执行阶段会优先启动服务,等数据库连接完成、路由注册代码执行时,服务已经启动完成,新增路由自然无法生效。
而把路由注册逻辑移到异步函数外时,路由注册是同步执行的,会在app.listen启动服务前完成,所以可以正常访问。
解决方案
推荐将服务启动逻辑放到所有初始化操作(数据库连接、路由注册)完成之后执行,参考代码如下:
const databaseConnection = async (apiRoutes, app) => { try { // 1. 完成数据库连接 await mongoose.connect(`mongodb+srv://replitUser:${process.env.DB_PW}@issuetracker.pbbm6.mongodb.net/myFirstDatabase?retryWrites=true&w=majority`); console.log("db connection successful"); // 2. 完成路由注册 apiRoutes(app); console.log("routes registered"); // 3. 最后启动Express服务 const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`service running on port ${PORT}`); }); } catch (err) { console.log("an err occurred", err); } } // 调用初始化函数即可 databaseConnection(apiRoutes, app);
该方案也可以避免出现「服务已经启动但数据库连接失败、接口完全不可用」的异常状态,符合服务初始化的最佳实践。
内容的提问来源于stack exchange,提问作者dasJulian
相关产品推荐
相关产品推荐

