You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无法连接Mongo Database及contracts未定义问题技术求助

帮你排查MongoDB连接与变量未定义问题

嘿,别担心,新手刚接触数据库配置时遇到这类问题太正常了!我帮你拆解下控制台里的两个错误,一步步解决:

问题1:数据库连接失败(Error connecting to the database)

你写的数据库连接地址是mongodb://localhost:3000/contractformapp,但这里有两个关键问题:

  • MongoDB默认的监听端口是27017,不是3000(你的Express服务器已经把3000端口占用了);
  • 除非你特意修改过MongoDB的配置文件,否则它不会在3000端口运行,这直接导致了连接失败。

问题2:变量未定义(ReferenceError: contracts is not defined)

  • 你没有提前声明contracts变量,JavaScript里未声明的变量会直接抛出错误;
  • 更核心的是:mongo.connect异步操作,你的根路由app.get('/')会在数据库连接完成前就执行,这时候contracts还没被赋值,自然会触发未定义的报错。

修复后的完整代码

const express = require('express');
const app = express();
const ejs = require('ejs');
const path = require('path');
const mongo = require('mongodb').MongoClient;
// 修正MongoDB端口为默认的27017
const dbUrl = 'mongodb://localhost:27017/contractformapp';
const bodyParser = require('body-parser');
const ObjectId = require('mongodb').ObjectId;

// 提前声明contracts变量,避免未定义错误
let contracts;

// 先完成数据库连接,再启动服务器和注册路由
mongo.connect(dbUrl, function(err, client) {
  if (err) {
    console.log("Error connecting to the database:", err);
    return; // 连接失败就终止后续执行,避免更多错误
  } 
  console.log("Connection to database was successful");
  contracts = client.db('contractformapp').collection('contracts');

  // 数据库连接成功后,再初始化中间件、路由和服务器
  app.use(bodyParser.json());
  app.use(bodyParser.urlencoded({ extended: false }));

  app.get('/', function (req, res) {
    contracts.find({}).toArray(function (err, docs) {
      if (err) {
        console.log(err);
        return res.status(500).send('获取数据失败');
      }
      res.render('index', { docs: docs });
    });
  });

  app.set('views', path.join(__dirname, 'views'));
  app.set('view engine', 'ejs');

  app.listen(3000, 'localhost', (err) => {
    if (err) {
      console.log('服务器启动失败:', err);
    } else {
      console.log('Server started listening on http://localhost:3000');
    }
  });
});

额外说明

  • 我把服务器启动和路由注册都放到了数据库连接成功的回调里,这样就能确保访问路由时,contracts集合已经被正确初始化;
  • 连接失败时加了return,避免后续代码继续执行引发更多连锁错误;
  • 如果你的MongoDB设置了用户名密码,记得把连接地址改成mongodb://username:password@localhost:27017/contractformapp的格式哦。

内容的提问来源于stack exchange,提问作者Arlind

火山引擎 最新活动