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

Express环境中Mongoose报错及路由兼容问题求助

问题分析与解决方案

一、Mongoose第20行错误排查

你的代码第20行属于MongoDB连接失败的catch回调,大概率是连接配置或依赖问题,按以下步骤修复:

  1. 补充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();
});
  1. 检查MongoDB服务状态
    确保本地MongoDB服务已经启动(执行mongod命令),否则无法建立连接。

  2. 验证模型文件正确性
    ./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');
});

三、验证流程

  1. 启动MongoDB服务,确认localhost:27017端口可访问。
  2. 核对TasasDeCambio模型的Schema定义无误。
  3. 启动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},更新汇率数据。

内容的提问来源于stack exchange,提问作者Juan David Castro Laynez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:54:53