在 NodeJS 和 MongoDB 后端配置多个数据库 --
Configuring multiple database in a NodeJS & MongoDB Backend --
如何在 NodeJS ExpressJS 后端项目中实例化、配置和使用多个不同的 MongoDB 数据库名称?我猜 MongoDB 中没有 'Tables' 的概念。我正在使用数据库 'playerDB' 并很好地使用它来添加、获取数据等。现在在我的项目中,我还想拥有用户登录和注册 [with roles] 的概念,因此需要一个新的数据库 'userDB'.
我该怎么做?在 Node Express Mongo 域中是否完全允许或允许?项目结构应该如何?我是将 mongoose 连接和相关内容全部写在一个 server.js 文件中还是在不同的此类文件中?
这是什么?我应该怎么做?
您可以使用一个数据库和多个集合。集合就像关系数据库管理系统中的表。您可以创建一个名为 "users" 的集合,然后您可以使用创建、更新、删除和提取操作。
所以我基本上就是这样实现的。就像我提到的,我不得不更改与 JWT_SECRET.
相关的一些部分
我的最终 server.js 看起来像这样 -->
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const PORT = 4000;
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const playerRoutes = express.Router();
const userRoutes = express.Router();
const userController = require('./controllers/userController');
const user_routes = require('./apiroutes/route');
const app = express();
const JWT_SECRET = "$#GR24T4344$#$@#%WTEWTEAE%";
const users = "users";
require("dotenv").config({path: __dirname+ '../.env'});
let Player = require('./models/player.model');
let User = require('./models/user.model');
app.use(cors());
app.use(bodyParser.json());
app.use(
bodyParser.urlencoded({
extended: false
})
);
mongoose.connect('mongodb://127.0.0.1:27017/playerDB', function (err, db) {
if (err)
throw err;
db.createCollection(users, function (err, resp) {
if (err)
throw err;
console.log("Collection created!");
});
}, { useNewUrlParser: true });
const connection = mongoose.connection;
connection.once('open', function () {
console.log("MongoDB database connection established successfully");
});
playerRoutes.route('/').get(function (req, res) {
Player.find(function (err, players) {
if (err) {
console.log(err);
} else {
res.json(players);
}
});
});
playerRoutes.route('/:id').get(function(req, res) {
let id = req.params.id;
Player.findById(id, function(err, player) {
res.json(player);
});
});
playerRoutes.route('/add').post(function (req, res) {
let player = new Player(req.body);
player.save()
.then(player => {
res.status(200).json({ 'player': 'player added successfully' });
})
.catch(err => {
res.status(400).send('adding new player failed');
});
});
var query = Player.find({ player_: "Hall of Fame" });
playerRoutes.route('/hallOfFame').get(function (req, res) {
query.exec(function (err, players) {
if (err) {
return handleError(err);
}
else {
res.json(players);
}
});
});
playerRoutes.route('/update/:id').post(function(req, res) {
Player.findById(req.params.id, function(err, todo) {
if (!player)
res.status(404).send('player data is not found');
else
player.player_name = req.body.player_name;
player.player_description = req.body.player_description;
player.player_position = req.body.player_position;
player.player_age=req.body.player_age;
player.player_club=req.body.player_club;
player.player_=req.body.player_;
player.player_isactive = req.body.player_isactive;
player.player_completed = req.body.player_completed;
Player.save().then(player => {
res.json('Player updated');
})
.catch(err => {
res.status(400).send("Update not possible");
});
});
});
app.use('/playerDB', playerRoutes);
app.use(async (req, res, next) => {
if (req.headers["x-access-token"]) {
try {
const accessToken = req.headers["x-access-token"];
const { userId, exp } = await jwt.verify(accessToken, JWT_SECRET);
// If token has expired
if (exp < Date.now().valueOf() / 1000) {
return res.status(401).json({
error: "JWT token has expired, please login to obtain a new one"
});
}
res.locals.loggedInUser = await User.findById(userId);
next();
} catch (error) {
next(error);
}
} else {
next();
}
});
app.use('/users', user_routes);
app.listen(PORT, function () {
console.log("Server is running on Port: " + PORT);
});
我在 .env 文件中有我的 jwt 秘密值。必须将它放在变量中的主文件本身中,因为 require("dotenv") 行根本不起作用。节点模块中有相关包。
如何在 NodeJS ExpressJS 后端项目中实例化、配置和使用多个不同的 MongoDB 数据库名称?我猜 MongoDB 中没有 'Tables' 的概念。我正在使用数据库 'playerDB' 并很好地使用它来添加、获取数据等。现在在我的项目中,我还想拥有用户登录和注册 [with roles] 的概念,因此需要一个新的数据库 'userDB'.
我该怎么做?在 Node Express Mongo 域中是否完全允许或允许?项目结构应该如何?我是将 mongoose 连接和相关内容全部写在一个 server.js 文件中还是在不同的此类文件中?
这是什么?我应该怎么做?
您可以使用一个数据库和多个集合。集合就像关系数据库管理系统中的表。您可以创建一个名为 "users" 的集合,然后您可以使用创建、更新、删除和提取操作。
所以我基本上就是这样实现的。就像我提到的,我不得不更改与 JWT_SECRET.
相关的一些部分我的最终 server.js 看起来像这样 -->
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const PORT = 4000;
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const playerRoutes = express.Router();
const userRoutes = express.Router();
const userController = require('./controllers/userController');
const user_routes = require('./apiroutes/route');
const app = express();
const JWT_SECRET = "$#GR24T4344$#$@#%WTEWTEAE%";
const users = "users";
require("dotenv").config({path: __dirname+ '../.env'});
let Player = require('./models/player.model');
let User = require('./models/user.model');
app.use(cors());
app.use(bodyParser.json());
app.use(
bodyParser.urlencoded({
extended: false
})
);
mongoose.connect('mongodb://127.0.0.1:27017/playerDB', function (err, db) {
if (err)
throw err;
db.createCollection(users, function (err, resp) {
if (err)
throw err;
console.log("Collection created!");
});
}, { useNewUrlParser: true });
const connection = mongoose.connection;
connection.once('open', function () {
console.log("MongoDB database connection established successfully");
});
playerRoutes.route('/').get(function (req, res) {
Player.find(function (err, players) {
if (err) {
console.log(err);
} else {
res.json(players);
}
});
});
playerRoutes.route('/:id').get(function(req, res) {
let id = req.params.id;
Player.findById(id, function(err, player) {
res.json(player);
});
});
playerRoutes.route('/add').post(function (req, res) {
let player = new Player(req.body);
player.save()
.then(player => {
res.status(200).json({ 'player': 'player added successfully' });
})
.catch(err => {
res.status(400).send('adding new player failed');
});
});
var query = Player.find({ player_: "Hall of Fame" });
playerRoutes.route('/hallOfFame').get(function (req, res) {
query.exec(function (err, players) {
if (err) {
return handleError(err);
}
else {
res.json(players);
}
});
});
playerRoutes.route('/update/:id').post(function(req, res) {
Player.findById(req.params.id, function(err, todo) {
if (!player)
res.status(404).send('player data is not found');
else
player.player_name = req.body.player_name;
player.player_description = req.body.player_description;
player.player_position = req.body.player_position;
player.player_age=req.body.player_age;
player.player_club=req.body.player_club;
player.player_=req.body.player_;
player.player_isactive = req.body.player_isactive;
player.player_completed = req.body.player_completed;
Player.save().then(player => {
res.json('Player updated');
})
.catch(err => {
res.status(400).send("Update not possible");
});
});
});
app.use('/playerDB', playerRoutes);
app.use(async (req, res, next) => {
if (req.headers["x-access-token"]) {
try {
const accessToken = req.headers["x-access-token"];
const { userId, exp } = await jwt.verify(accessToken, JWT_SECRET);
// If token has expired
if (exp < Date.now().valueOf() / 1000) {
return res.status(401).json({
error: "JWT token has expired, please login to obtain a new one"
});
}
res.locals.loggedInUser = await User.findById(userId);
next();
} catch (error) {
next(error);
}
} else {
next();
}
});
app.use('/users', user_routes);
app.listen(PORT, function () {
console.log("Server is running on Port: " + PORT);
});
我在 .env 文件中有我的 jwt 秘密值。必须将它放在变量中的主文件本身中,因为 require("dotenv") 行根本不起作用。节点模块中有相关包。