我需要根据请求来源在loopback数据源中切换数据库
例如。如果我从 xyz.domain.com
发出请求,我需要为数据源选择 xyz
数据库(我们在前端使用通配符子域,因此会有多个这样的子域名。)
我尝试构建中间件,从每个请求源中提取子域,并为数据源设置数据库。现在的问题是在几个同时发出的请求之后,环回服务器因“连接太多”而中断(可能是因为它在每个请求上都创建了新的连接线程)
(我使用my-sql连接器作为数据源)
以下是我的中间件代码
'use strict';
const DataSource = require('loopback-datasource-juggler').DataSource;
const app = require('../../server/server.js');
const getSubdomain = require('../middlewares/getSubdomain.js');
module.exports = function() {
return function datasourceSelector(req, res, next) {
if (req.path !== '/api/check-realm') {
let subdomain = getSubdomain(req); // this will get me subdomain from request origin
let dataSource = new DataSource({
'host': 'localhost',
'port': 3306,
'database': subdomain ? subdomain[1] || 'default' : 'default',
'user': 'user',
'password': 'user',
'name': 'mysqlDS',
'connector': 'mysql'
}); // This creates new datasource on every request with appropriate database
let models = app.models();
models.forEach(function(model) {
if (model.modelName !== 'Email') {
model.attachTo(dataSource);
}
}); // here I am attaching all models to the newly created datasource.
app.dataSource("mysqlDS", dataSource);
}
next();
};
};
实现这一目标的其他方法也很有用。
答案 0 :(得分:0)
app.datasources
包含您在应用程序中定义的所有数据源。
例如:
// datasources.json
{
"memo": {
"name": "memo",
"connector": "memory"
},
"admin": {
"host": "localhost",
"port": 27017,
"url": "",
"database": "test_db",
"password": "",
"name": "admin",
"user": "",
"connector": "mongodb"
}
然后在您的代码中检查子域名并且:
...
if (subdomain === 'admin'){
models.forEach(function(model) {
if (model.modelName !== 'Email') {
model.attachTo(app.datasources.admin);
}
});
}
...