首页 > 解决方案 > NodeJS + mongoose - 全局用户动态数据库

问题描述

我正在使用 NodeJS、ExpressJS、express-session、connect-mongo 和 mongoose。我想为每个用户创建一个数据库。登录时,数据库连接应该是全局使用的。

这是:登录控制器

exports.loginPost = (req, res, next) => {
  const email = req.body.email;
  const pass = req.body.password;
  const pin = req.body.pin;

  if (email && pass && pin) {
    User.findOne({ email })
      .then(u => {
        bcrypt.compare(pass, u.password, (err, result) => {
          if (!err) {
            bcrypt.compare(pin, u.pin, (err2, result2) => {
              if (!err2) {
                let msg = {};
                global.userDB = null;
                msg.success = [{ text: "You are now logged in..." }];
                req.session.loggedIn = true;
                req.session.userId = u._id;
                req.session.role= u.role;

                const Mongoose = require("mongoose").Mongoose;
                const inst = new Mongoose();

                let db = "user-" + orgid;
                global.userDB = inst.connect(
                  "mongodb://localhost:27017?authSource=dbWithUserCredentials",
                  {
                    useNewUrlParser: true,
                    auth: { authSource: "admin" },
                    user: "root",
                    pass: "root",
                    dbName: db,
                    autoReconnect: true
                  }
                );

                return res.redirect("/");
              } else {
                console.log(err2);
              }
            });
          } else {
            return res.render("login", {
              req,
              msg: null
            });
          }
        });
      })
      .catch(err => {
        return res.render("login", {
          req,
          msg: err
        });
      });
  }
};

这是地址模型:

const aschema = global.userDB.Schema;
var AdressSchema = new aschema({
  name: {
    type: String
  }
});

var Address = global.userDB.model("Adress", AdressSchema);
module.exports = Address;

当我运行使用此模型的页面时,当我使用此命令时,我会在控制台上看到它:“console.log(global.userDB)”;

NativeConnection {
  base:
   Mongoose {
     connections: [ [Circular] ],
     models: {},
     modelSchemas: {},
     options: { pluralization: true },
     plugins: [ [Array], [Array], [Array] ] },
  collections: {},
  models: {},
  config: { autoIndex: true },
  replica: false,
  hosts: null,
  host: 'localhost',
  port: 27017,
  user: 'root',
  pass: 'root',
  name: 'user-undefined',
  options:
   { pass: 'root',
     user: 'root',
     auth: { authSource: 'admin' },
     useNewUrlParser: true,
     db: { forceServerObjectId: false, w: 1 },
     server: { socketOptions: {}, auto_reconnect: true },
     replset: { socketOptions: {} },
     mongos: undefined },
  otherDbs: [],
  states:
   [Object: null prototype] {
     '0': 'disconnected',
     '1': 'connected',
     '2': 'connecting',
     '3': 'disconnecting',
     '4': 'unauthorized',
     '99': 'uninitialized',
     disconnected: 0,
     connected: 1,
     connecting: 2,
     disconnecting: 3,
     unauthorized: 4,
     uninitialized: 99 },
  _readyState: 2,
  _closeCalled: false,
  _hasOpened: false,
  _listening: false,
  db:
   Db {
     _events: [Object: null prototype] {},
     _eventsCount: 0,
     _maxListeners: undefined,
     s:
      { databaseName: 'user-undefined',
        dbCache: {},
        children: [],
        topology: [Server],
        options: [Object],
        logger: [Logger],
        bson: BSON {},
        authSource: undefined,
        readPreference: undefined,
        bufferMaxEntries: -1,
        parentDb: null,
        pkFactory: undefined,
        nativeParser: undefined,
        promiseLibrary: [Function: Promise],
        noListener: false,
        readConcern: undefined },
     serverConfig: [Getter],
     bufferMaxEntries: [Getter],
     databaseName: [Getter] } }

有人可以说,为什么我在数据库名称中得到一个“未定义”,但是当我 console.log 的“db”变量时,有正确的 user._id。

谢谢!

标签: node.jsdatabasemongodbexpressexpress-session

解决方案


推荐阅读