Express环境中Mongoose报错及路由兼容问题求助
问题分析与解决方案
一、Mongoose第20行错误排查
你的代码第20行属于MongoDB连接失败的catch回调,大概率是连接配置或依赖问题,按以下步骤修复:
- 补充Mongoose连接参数
新版本Mongoose要求必须指定useUnifiedTopology参数,否则会触发兼容性错误,修正连接代码:
mongoose.connect('mongodb://localhost:27017/tasasDeCambio', { useNewUrlParser: true, useUnifiedTopology: true // 新增该参数解决版本兼容问题 }).then(() => { console.log("Conexión exitosa a la base de datos"); }).catch(err => { console.log('No se pudo conectar a la base de datos. Saliendo...', err); process.exit(); });
检查MongoDB服务状态
确保本地MongoDB服务已经启动(执行mongod命令),否则无法建立连接。验证模型文件正确性
./server/models/TasasDeCambio.js的Schema定义必须符合Mongoose规范,示例正确写法:
const mongoose = require('mongoose'); const TasasDeCambioSchema = new mongoose.Schema({ moneda: { type: String, required: true }, tasa: { type: Number, required: true } }); module.exports = mongoose.model('TasasDeCambio', TasasDeCambioSchema);
如果模型定义错误,即使连接成功,后续路由调用也会抛出异常,可能被错误定位到第20行。
二、Express路由兼容与类变更适配
1. 路由模块化拆分(解决类变更时路由可用性)
当前路由直接写在主文件中,后续TasasDeCambio类结构变更时,维护成本极高。把路由抽成独立模块:
创建./server/routes/tasasDeCambioRoutes.js:
const express = require('express'); const router = express.Router(); const TasasDeCambio = require('../models/TasasDeCambio'); // POST 创建汇率 router.post('/', (req, res) => { const tasaDeCambio = new TasasDeCambio({ moneda: req.body.moneda, tasa: req.body.tasa }); tasaDeCambio.save() .then(data => res.send(data)) .catch(err => res.status(500).send({ message: err.message || "Ocurrió un error al crear la tasa de cambio." })); }); // GET 查询所有汇率 router.get('/', (req, res) => { TasasDeCambio.find() .then(tasasDeCambio => res.send(tasasDeCambio)) .catch(err => res.status(500).send({ message: err.message || "Ocurrió un error al obtener las tasas de cambio." })); }); // PUT 更新汇率 router.put('/:tasaId', (req, res) => { TasasDeCambio.findByIdAndUpdate(req.params.tasaId, { moneda: req.body.moneda, tasa: req.body.tasa }, {new: true}) .then(tasaDeCambio => { if(!tasaDeCambio) { return res.status(404).send({ message: "No se encontró una tasa de cambio con el id " + req.params.tasaId }); } res.send(tasaDeCambio); }).catch(err => { if(err.kind === 'ObjectId') { return res.status(404).send({ message: "No se encontró una tasa de cambio con el id " + req.params.tasaId }); } return res.status(500).send({ message: "Ocurrió un error al actualizar la tasa de cambio con el id " + req.params.tasaId }); }); }); module.exports = router;
在主文件中挂载路由:
// 其他依赖引入后添加 const tasasRoutes = require('./server/routes/tasasDeCambioRoutes'); // 数据库连接成功后挂载 app.use('/tasasDeCambio', tasasRoutes);
后续TasasDeCambio类字段变更时,只需修改路由模块中的对应字段,主文件无需改动,保证路由始终可用。
2. 环境兼容的路由配置
通过环境变量区分开发/生产环境的路由前缀,避免环境冲突:
const basePath = process.env.NODE_ENV === 'production' ? '/api/v1' : ''; app.use(`${basePath}/tasasDeCambio`, tasasRoutes);
启动时设置环境变量:NODE_ENV=production node app.js,生产环境接口前缀自动变为/api/v1/tasasDeCambio。
3. 完善错误处理
当前代码缺少404和全局错误处理,添加后能更清晰定位路由问题:
// 404路由匹配 app.use((req, res) => { res.status(404).send('Ruta no encontrada'); }); // 全局错误处理中间件 app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('Error interno del servidor'); });
三、验证流程
- 启动MongoDB服务,确认
localhost:27017端口可访问。 - 核对
TasasDeCambio模型的Schema定义无误。 - 启动Express服务,用Postman/curl测试接口:
- POST
http://localhost:3000/tasasDeCambio,传入JSON参数{"moneda":"USD","tasa":1.0}。 - GET
http://localhost:3000/tasasDeCambio,验证返回数据。 - PUT
http://localhost:3000/tasasDeCambio/{文档ID},更新汇率数据。
- POST
内容的提问来源于stack exchange,提问作者Juan David Castro Laynez
相关产品推荐
相关产品推荐

