【问题标题】:Configuring multiple database in a NodeJS & MongoDB Backend --在 NodeJS 和 MongoDB 后端配置多个数据库 --
【发布时间】:2020-02-16 18:29:13
【问题描述】:

如何在 NodeJS ExpressJS 后端项目中实例化、配置和使用多个不同的 MongoDB 数据库名称?我想MongoDB中没有“表”的概念。我正在使用数据库“playerDB”并很好地使用它来添加、获取数据等。现在在我的项目中,我还希望有用户登录和注册 [with roles] 的概念,因此需要一个新的 DB 'userDB' .

我该怎么做?在 Node Express Mongo 域中是否完全允许或允许?项目结构应该如何?我是在一个 server.js 文件中还是在不同的此类文件中编写 mongoose 连接和相关内容?

这是什么?我该怎么做?

【问题讨论】:

  • 为什么不在一个数据库中创建这些多个集合?
  • 您可以从这里开始:docs.mongodb.com 和这里docs.mongodb.com/guides
  • 因为我不知道我们是否可以在 MongoDB 中做到这一点,以及如何做到这一点,就像我们在 MSSQL 中所做的那样
  • 和关系型数据库一样,一个数据库可以有多个表,一个mongo数据库也可以有多个集合。表 == 集合
  • 请阅读 MongoDB 文档,他们解释了使用数据库的基本思想。

标签: node.js mongodb express axios mern


【解决方案1】:

您可以使用一个数据库和多个集合。集合就像关系数据库管理系统中的表。您可以创建一个名为“users”的集合,而不是使用创建、更新、删除和获取操作。

【讨论】:

  • 嗨@jonrsharpe 我已经在 playerDB 数据库中创建了我的用户集合。成功地。但问题是我现在是否想使用邮递员测试我的插入删除方法。我如何发送请求。到哪个集合,playerDB 或用户?我的后端托管在端口 4000。所以基本上我要问的是我的请求格式应该是什么——> localhost:4000/playerDB/Users 或 localhost:4000/Users。感谢您帮助整理第一部分。
  • @PrabirChoudhury 为什么 REST API 用户会关心数据库名称?他们只关心resource,它可能与集合名称相同也可能不同,可能是DELETE /users/:id
  • @jonrsharpe 好的,让我自己尝试一下这部分。截至目前,遇到了一些麻烦;我尝试使用 localhost:4000/users [POST] 然后使用一些数据来创建新用户。但它失败了。为了仔细检查,我运行了 db.runCommand({listCollections:1}) 只是为了确保 playerDB.users 集合存在并且确实存在。请给我一个mo_;再次尝试。
  • 我解决了。一个小小的改变就完成了必要的工作。我在 app.use('/users', user_routes); 行中犯了一个错误。我直接添加了数据库名称,而不是 user_routes,例如 app.use('/users', 'users')。因为这样的要求是不正确的。我现在可以将新用户添加到 playerDB 数据库中的用户集合中。通过邮递员本身。它现在有效,暂时;但是,我仍然必须对我的代码和项目结构进行一些调整才能完成这项工作。因为我在添加用户时使用了 jwt 机制,而且 bcrypt 和 jsonwebtoken 包存在很多问题! @jonrsh
【解决方案2】:

所以这就是我基本上实现它的方式。就像我提到的,我必须更改与 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%$6";


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") 行根本不起作用,因此必须将其放入主文件本身的变量中。相关包在节点模块中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 2021-01-16
    相关资源
    最近更新 更多