首页 > 解决方案 > 使用 MVC Node.js 时如何连接到 MongoDB?

问题描述

当我尝试写入 MongoDB 数据库时出现错误,以下是错误。

/root/deployme/node_modules/mongodb/lib/mongo_client.js:315
    throw new MongoError('MongoClient must be connected before calling MongoClient.prototype.db');
    ^

MongoError: MongoClient must be connected before calling MongoClient.prototype.db
    at MongoClient.db (/root/deployme/node_modules/mongodb/lib/mongo_client.js:315:11)
    at Object.<anonymous> (/root/deployme/models/user.models.js:9:19)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (/root/deployme/controllers/controller.js:3:15)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)

我从我的 controller.js 调用代码,这里是代码:

exports.regUser = async (req, res) => {
  const ip = (
    req.headers["x-forwarded-for"] ||
    req.connection.remoteAddress ||
    ""
  )
    .split(",")[0]
    .trim();
  const data = req.body;
  const write = await model.writeReg(data);
  res.json(write);
}

这是我的模型:

const axios = require('axios');
const helper = require('../helper');
const {MongoClient} = require('mongodb');

const uri = 'mongodb://myserver:27017/?poolSize=20&writeConcern=majority';
const client = new MongoClient(uri);
client.connect();

const db = client.db('rixca');
const userRef = db.collection('users');
const regRef = db.collection('register');
const actRef = db.collection('activity');
const cpRef = db.collection('cpanels');
const feedRef = db.collection('feedback');

exports.writeReg = async (data) => {
    const unique = helper.uniqueKey();
    const scheme = {
        uid: unique,
        email: data.email,
        expired: Date.now() + 60000,
    };
    const check = await this.checkReg(data.email);
    if(check.status === 'regisrered') {
        return {status: 400, message: "Email already in use."};
    }
    if(check.status === "wait") {
        return {status: 400, message: "Try again later"};
    }
    const recheck = await this.isExist(regRef, {email: data.email});
    if(recheck.status) {
        await regRef.deleteOne({_id: recheck.data._id});
    }
    const letStart = await regRef.insertOne(scheme);
    if(!letStart) return {status: 500, message: "Something went wrong"};
    return {status: 200, message: "We has sent you an email", uid: unique};
}

exports.checkReg = async (value) => {
    const query = {email: value}
    const user = await userRef.findOne(query);
    if(user != null) {
        return {status: 'registered'};
    }
    const regist = await regRef.findOne(query);
    if(regist === null) {
        return {status: "ready"};
    }
    if(regist.expired > Date.now()) {
        return {status: 'wait'};
    } else {
        return {status: 'ready'};
    }
}

exports.isExist = async (collection, query) => {
    if(collection == 'user') {
        collection = userRef;
    }
    if(collection == "reg") {
        collection = regRef;
    }
    const snapshoot = await collection.findOne(query);
    const status = (snapshoot != null);
    return {
        status,
        data: snapshoot,
        docId : snapshoot._id,
    };
}

我尝试在controller.js 中连接到MongoDB,但它仍然抛出错误,那么有没有一种方法可以在不连接每个函数的情况下连接到MongoDB?

标签: node.jsmongodbexpress

解决方案


您没有正确使用 connect()。

这是一些示例代码,但请尝试M220JS:MongoDB for Javascript Developers

索引.js

MongoClient.connect(
  process.env.DB_URI,
  {newUserParser: true}
).catch( err => {
   console.log(err.stack)
}).then(async client => {
   await userDAO.injectDB(client)
   app.listen(3000, () => {
     console.log(`listening on port 3000`)
   })
})

用户DAO.js

let users
export default class UsersDAO {
  static async injectDB(conn) {
    if(users) {
      return
    }
    try {
      users = await conn.db(process.env.DB_NAME).collection("users")
    } catch(e) {
      console.log(e)
    }
  }
}
 
static async doesUserExist(query){
  try{
    const snapshoot = await users.findOne(query);
    const status = (snapshoot != null);
    return {
       status,
       data: snapshoot,
       docId : snapshoot._id,
    };
  }
}

推荐阅读