Как бы я изменил активную базу данных MongoDB на основе req.param? - PullRequest
2 голосов
/ 10 мая 2019

У меня есть локализованная база данных обслуживания, которая будет работать в локальной сети без доступа в Интернет. Я недавно мигрировал из базы данных SQL в Mongo, основываясь на других требованиях, которые мне необходимы для продвижения вперед, и я пытаюсь восстановить существующие функциональные возможности с помощью нового бэкэнда express / mongo, а не nginx / mariaDB, который я выполнял. Как только я получу это обратно, я могу двигаться дальше, добавив новые требования ...

Моя проблема сейчас заключается в попытке изменить активную базу данных в MongoDB (используя mongoose) на основе req.param. Я могу использовать параметры в реальных запросах, но хотел бы, чтобы база данных была установлена ​​для каждого из аппаратных наборов высокого уровня, которые нуждаются в приложении.

Пример:

http://1.2.3.4/api/HardwareA/tasks для возврата элементов из коллекции задач базы данных оборудования A

http://1.2.3.4/api/HardwareB/tasks для возврата элементов из коллекции задач базы данных оборудования B

Я пытался поиграть с функцией useDB (), но не смог заставить что-либо работать, как указано выше. Я могу получить рабочие пути поиска путем жесткого кодирования базы данных в mongoose.connection, но это не очень динамично.

содержит приведенные ниже данные по нескольким различным файлам, работающим с жестко закодированными базами данных, и просто нужно попытаться выяснить, как реализовать изменение базы данных на раннем уровне.

У меня есть параметры слияния, потому что я пытался выполнить приведенное ниже с помощью req.param.db для загрузки баз данных, но при первоначальной сборке я всегда получаю req не определено, что имеет смысл для меня. Просто не знаю, как сделать это соответствующим образом. Все эти экспресс-вещи являются новыми для меня. Я уверен, что это то, что я просто не вижу.

Спасибо за любую помощь.

из package.json для ссылок на версии.

"express": "^4.16.4",
"express-session": "^1.16.1",
"mongodb": "^3.2.3",
"mongoose": "^5.5.3",

апи / index.js

const express = require('express')
const mongoose = require('mongoose')
const bodyParser = require('body-parser')
const cors = require('cors')
const app = express()

const mongoUser = 'User'
const mongoPass = 'superPass'
const mongoServer = '192.168.5.5'
const mongoPort = '27017'
/* const mongoDB = req.param.db || ''
const mongoURI = `mongodb://${mongoUser}:${mongoPass}@${mongoServer}:${mongoPort}/maintCenter${mongoDB}?authSource=admin` // fail A */

const mongoURI = `mongodb://${mongoUser}:${mongoPass}@${mongoServer}:${mongoPort}/maintCenter?authSource=admin`

mongoose.connect(mongoURI, {
  useNewUrlParser: true
})

// mount the router on the app
app.options('*', cors())
app.use(bodyParser.json())
app.use('/api', require('./routes'))

module.exports = app

api / route / index.js * edit - добавили этот файл

const router = require('express').Router()
const mongoose = require('mongoose')

router.use('/:db/taskdata', require('./taskRoute'))

module.exports = router

* * Апи тысячу тридцать один / маршруты / taskRoute.js
const express = require('express')
const mongoose = require('mongoose')

const taskRoute = express.Router({ mergeParams: true })

const Task = require('../models/taskModel')

// get all tasks
taskRoute.route('/').get(function(req, res) {
//gives mongoose.connection.useDB is not a function // Fail B
//mongoose.connection.useDB(`maintCenter${req.param.db}`)
  Task.find(function(err, tasks) {
    if (err) {
      res.json(err)
    } else {
      res.json(tasks)
    }
  })
})

module.exports = taskRoute

Вопросы:

Конечные пользователи : около 30 человек на 3 или 4 рабочих сайтах в моей группе. Совсем не технический.

Платформа : веб-приложение VueJS, axios для представлений.

Одиночная база данных : Рассматривалось сделать это как мультитенант с использованием Эта библиотека , но я задумался о том, как справиться с аппаратным резервным копированием / восстановлением. Возможно, есть простой способ справиться, и я просто не смог его найти, и это вернуло меня к отдельным базам данных, как это было с MariaDB. Не был продан, просто возвращался к тому, что имел и знал.

По этой теме, я бы просто делал два поиска для каждой команды? это было бы что-то вроде

Task.find(
  {
    hardware: 'A',
    somethingElse: '123'
  }
)

можно было бы сделать что-то еще по линии

tasks = Task.find(hardware: 'A')

taskRoute.route('/').get(function(req, res) {
  Task.find(function(err, tasks) {
    if (err) {
      res.json(err)
    } else {
      res.json(tasks)
    }
  })
})

Я даже не знаю, разумно ли это. Просто пытаюсь найти лучший общий способ добиться этого. Большое спасибо за вашу помощь в проверке этого материала. Я читал в течение 2 недель и получил несколько кодов скелета, работавших несколько дней назад, но это был самый долгий путь до сих пор. Я надеюсь, что вышеупомянутое заполняет правильные биты данных.

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Хороший способ сделать это - сохранить все в одной базе данных и иметь поле hardware, определенное в каждой схеме, в которой хранится имя оборудования из запроса.

Затем на вашемконечные точки, вы будете делать запросы Mongoose, затрагивающие только те задачи, для которых в поле оборудования указано аппаратное обеспечение из запроса.

Если у вас нет очень специфического требования, которое заставляет вас использовать несколько баз данных (что, безусловно, не так)), это было бы неправильным представлением схем вашей базы данных, даже если это, вероятно, выполнимо (но приведет к неправильному коду imo).

Код для моего предыдущего ответа

1 голос
/ 11 мая 2019

Принял ваш ответ, потому что он дал достаточно подробностей, чтобы я знал, что я иду вниз, может быть, это не неправильный путь, но тот, который был нелегким для моего текущего уровня квалификации.Законченный использованием mongo-tenant library и теперь с нижеприведенным я могу фильтровать многое, как вы предлагали в моей единой базе данных.Я могу сделать доступ пользователей позже только для чтения против чтения и записи, и это должно делать все, что мне нужно, поскольку мне не нужно разделять разрешения по коллекции или что-то в этом роде.

Большое спасибо за вашу помощь.Вот где я оказался.

api / index.js (без изменений сверху)

api / router / index.js (без изменений сверху)

api / routs / taskRoute.js

const express = require('express')

const taskRoute = express.Router({ mergeParams: true })

const Task = require('../models/taskModel')

// get all tasks
taskRoute.route('/').get(function(req, res) {
  const boundTask = Task.byTenant(req.params.db)
  console.log(req.param.db)
  boundTask.find(function(err, tasks) {
    if (err) {
      res.json(err)
    } else {
      res.json(tasks)
    }
  })
})

module.exports = taskRoute

api / models / taskModel.js

const mongoose = require('mongoose')
const mongoTenant = require('mongo-tenant')

const taskSchema = new mongoose.Schema(
  {
    taskID: {
      type: Number,
      unique: true,
      required: true,
      trim: true
    },
    taskName: String,
    category: String,
    lastCompletion: Date,
    detailDescription: Boolean,
    active: { type: Boolean, default: true }
  },
  { timestamps: true }
)

taskSchema.plugin(mongoTenant)

const Task = mongoose.model('Task', taskSchema)

module.exports = Task

затем, когда я создаю задачу или сохраняю ее, я добавляю свойство: tenantId: this.$route.param.db, как определено в моих маршрутах проекта VUE, оно будет тянутьсуществующий маршрут, поэтому задача создается на основе открытой в данный момент страницы.

таким образом hardwareA / tasks сортирует только нужные данные, один набор моделей и одну базу данных.

Возможно, позже возникнет непредвиденная проблема, но сейчас я думаю, что могу продолжать двигаться вперед с миграцией данных существующего материала.

Большое спасибо за помощь в получении рабочей модели.Я не смогу позволить им просто создавать произвольные базы данных таким образом, но, возможно, это в любом случае лучше.Я просто приведу некоторые общепринятые общие термины для их использования в нужном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...