node.js - 使用 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?
解决方案
您没有正确使用 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,
};
}
}
推荐阅读
- java - 添加 Apache POI 作为外部库后应用程序立即崩溃
- php - 在 html标签中显示来自 curl 请求的图像
- apache-kafka - Kafka 消费者何时重试?
- ffmpeg - FFMPEG 在剪辑结束时切断音频
- apache-kafka - LogCompaction and consumer in Kafka
- r - Create sequence of values based on multiple column values in R
- node.js - How do I get my async function to return values not a promise?
- makefile - ocamlbuild: Nothing to be done for `all'
- botframework - 是否可以在自适应卡上实现简单的计数器?就像每次单击提交按钮时,文本块中的值都会增加
- solr - SOLR 索引任意数据