gpt4 book ai didi

node.js - 我将如何根据 req.param 更改 MongoDB 事件数据库?

转载 作者:搜寻专家 更新时间:2023-11-01 00:34:51 24 4
gpt4 key购买 nike

我有一个本地化的维护数据库,它将在没有 Internet 访问权限的 LAN 上运行。我最近根据我需要满足的其他要求从 SQL 数据库迁移到 Mongo,并且我正在尝试使用新的 express/mongo 后端而不是我一直在运行的 nginx/mariaDB 来备份我现有的功能。一旦我得到这个备份,我就可以继续添加新的要求......

我现在的问题是尝试根据 req.param 更改 MongoDB 中的事件数据库(使用 mongoose)。我可以在实际查询中使用参数,但希望为每个需要该应用程序的高级硬件集设置一个数据库。

例子:

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 not defined,这对我来说很有意义。只是不确定如何适本地去做这件事。所有这些 express 的东西对我来说都是新的。我确定这是我没有看到的东西。

感谢您的帮助。

来自 package.json 的版本引用。

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

api/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/routes/index.js *编辑 - 添加了这个文件

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

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

module.exports = router

api/routes/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

问题:

最终用户:我的团队中有 3 到 4 个工作地点的大约 30 个人。大多数根本不是技术性的。

平台:VueJS 网络应用程序,用于提交的 axios。

单一数据库:考虑使用 This Library 将其作为 Multi-Tenancy 进行但我一直在思考如何处理特定于硬件的备份/恢复。可能有一种简单的方法来处理,但我就是找不到它,这让我回到了单独的数据库,就像我使用 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 周,并在几天前获得了一些框架代码,但这是迄今为止最长的等待时间。我希望上面填写了正确的数据位。

最佳答案

这样做的好方法是将所有内容保存在同一个数据库中,并在每个存储请求中的硬件名称的模式中定义一个 hardware 字段。

然后,在您的端点上,您将发出 Mongoose 请求,仅影响硬件字段设置为请求中的硬件的任务。

除非你有一个非常具体的要求迫使你使用多个数据库(当然不是这种情况),否则这将是对你的数据库模式的误解,即使它可能是可行的(但会导致糟糕的代码 imo ).

Code for my previous answer

关于node.js - 我将如何根据 req.param 更改 MongoDB 事件数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56084264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com