【问题标题】:NodeJS Mongoose Connect to different MongoDB Databases and CollectionsNodeJS Mongoose 连接到不同的 MongoDB 数据库和集合
【发布时间】:2018-11-27 05:01:16
【问题描述】:

我的 MongoDB 中有多个数据库和多个集合。下面的脚本可以作为我的 Restful API 层正常工作。我正在使用 Mongoose 连接到数据库(mongodb://localhost:3002/24hiresJobPost)和名为“jobs”的集合。在客户端,像这样的网址http://localhost:3001/api/status?可以通过 HTTP 发送以从 24hiresJobPost 数据库中获取/发布/放置/删除数据。我的问题是如何从 android/ios 客户端捕获用户输入,并根据用户输入连接到不同的数据库。例如,如果用户想从 24hiresUser 数据库而不是 24hiresJobPost 数据库中查询数据。目前这是不可能的,因为正在连接的数据库是硬编码的。

服务器.js

//dependencies:

var express = require('express');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');

//connect to mongoDB
mongoose.connect('mongodb://localhost:3002/24hiresJobPost');
mongoose.set("debug",true);

//express
var app = express();
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());

//routes
app.use('/api', require('./routes/api'));

app.get('/test',(req,res) =>{
  console.log('/test trigger');
  res.send('server.js test OK!');
});


//strt server
app.listen(3001);
console.log('Server is runing on port 3001');

Api.js

//dependencies:
var express = require('express');
var router = express.Router();

//get models:
var Status = require('../models/status');

//routes
Status.methods(['get', 'post', 'put', 'delete']);
Status.register(router, '/status');

//return router:
module.exports = router;

Status.js

//dependencies:
var restful = require('node-restful');
var mongoose = restful.mongoose;

//Schema
var statusSchema = new mongoose.Schema({
    category : String,
    category_mostrecent_startdate : Number,
    category_mostrecent_wagesrange : Number,
    category_mostrecent_wagesrange_startdate : Number,
    category_negatedtime : Number,
    city : String,
    closed : String,
    company : String,
    date : String,
    desc : String,
    fulladdress : String,
    latitude : Number,
    longitude : Number,
    lowertitle : String,
    mostrecent_startdate : Number,
    mostrecent_wagesrange : Number,
    mostrecent_wagesrange_startdate : Number,
    negatedtime : Number,
    postimage : String,
    postkey : String,
    time : Number,
    title : String,
    uid : String,
    userimage : String,
    username : String,
    wages : String
});

//return models:
module.exports = restful.model('jobs', statusSchema);

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我使用了这种方法:

    创建的类数据库包含有关当前数据库的信息并加载给定数据库的所有关联模型。

    const mongoose = require('mongoose');
    const fs = require('fs');
    const _ = require('lodash');
    
    class Database {
        constructor(db, name) {
            this.db = db;
            this.name = name;
            this.connect(db, name);
        }
    
        connect(db, name) {
            const connection = mongoose.createConnection(db.init.name, db.init.options);
    
            fs.readdirSync(`${__dirname}/models/${name}`).forEach(function(file) {
                if (file.indexOf('.js')) {
                    require(`./models/${name}/${file}`)(connection);
                }
            });
    
            this.connection = connection;
        }
    }
    
    module.exports = Database;
    

    然后我们有它的公共接口(称之为dbHandler.js

    const mongoose = require('mongoose');
    const Database = require('./Database');
    const _ = require('lodash');
    
    mongoose.Promise = global.Promise;
    const dbMap = new Map();
    
    exports.register = (db, name = 'default') => {
        const database = new Database(db, name);
        dbMap.set(name, database);
        return database;
    };
    
    exports.mongoose = (name = 'default') => {
        return _.get(dbMap.get(name), 'connection');
    };
    

    然后您可以动态选择不同的连接,即dbHandler.mongoose('24hiresUser')

    【讨论】:

    • 我们可以为每个不同的数据库连接使用相同的模型吗?
    • @Prana - 是的,但您必须确保将查询或模型实例绑定到 exports.mongoose 而不是 require('mongoose')。然后使用正确的。
    猜你喜欢
    • 1970-01-01
    • 2019-03-14
    • 2011-11-10
    • 2017-03-02
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 2020-07-11
    相关资源
    最近更新 更多