У меня есть локализованная база данных обслуживания, которая будет работать в локальной сети без доступа в Интернет. Я недавно мигрировал из базы данных 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 недель и получил несколько кодов скелета, работавших несколько дней назад, но это был самый долгий путь до сих пор. Я надеюсь, что вышеупомянутое заполняет правильные биты данных.