Node.js仅nodemon/babel-node可处理请求 npm start启动接口失效
问题根因与修复方案
你的问题本质是开发环境运行源码、生产环境运行编译后产物的逻辑不一致,结合切库的操作点,按以下顺序排查即可解决:
- 第一优先级:重新执行编译命令
你的npm run dev是通过babel-node直接运行src目录下的原始源码,修改代码后nodemon会自动热更;但npm start是直接运行dist目录下经babel编译后的静态产物,不会自动同步你src目录下最新的切库、代码修改逻辑。
你切完新数据库配置后如果没有手动执行npm run build重新生成dist目录的代码,dist里留存的还是旧版本代码,要么连库配置不对,要么代码逻辑和当前源码不匹配,直接导致接口异常。
修复操作:停掉当前服务,依次执行# 先删除旧的编译产物避免缓存 rm -rf dist # 重新编译最新源码 npm run build # 再启动生产服务 npm start - 第二优先级:修复数据库连接的路径与权限问题
- 检查你未贴出的
database.js连接逻辑:如果使用dotenv读取环境变量,不要用相对路径加载.env文件。babel编译后代码运行在dist目录,相对路径会指向dist下的位置,读不到项目根目录的.env配置,导致新库的连接地址、账号密码读取为空,连库超时挂死所有请求。请改成基于__dirname的绝对路径加载配置。 - 检查新数据库的访问权限:dev环境下你本地直连测试库权限是通的,但新数据库如果没有给你运行服务的机器IP开放访问白名单、或者账号没有
usuarios表的查询权限,连接会直接失败。
- 检查你未贴出的
- 第三优先级:补全接口异常捕获
你当前所有接口的数据库操作都没有加try/catch错误捕获,一旦连库失败、SQL执行报错,异常不会被正常响应,会直接把请求挂到超时,前端/Postman只会收到连接失败提示,看不到具体错误。
给控制器逻辑加上错误捕获,以getUsers为例:
加完重新编译启动,控制台会直接打印具体错误原因(密码错误/IP被拦截/表不存在等),不用盲猜问题。export const getUsers = async (req, res) => { console.log('first'); try { const connection = await connect(); const[rows] = await connection.query('SELECT * FROM usuarios'); res.json(rows); } catch (err) { // 打印具体错误方便定位 console.error('接口执行异常:', err); res.status(500).json({ error: err.message }); } }; - 额外校验点:确认编译产物完整性
执行完build后检查dist目录结构,要和src目录结构完全对应,确保database.js、swaggerOptions.js这些依赖文件都被正确编译到dist对应路径,不存在文件缺失导致的引用报错。
内容的提问来源于stack exchange,提问作者ArminAH
相关产品推荐
相关产品推荐

