2017-01-27 2 views
3

Ich brauche die Datenbank in Loopback-Datenquelle auf der Basis der Anfrage HerkunftLoopbackjs: Schalten DB in Datenquelle basierend auf Anfrage Herkunft

zB zu wechseln. Wenn ich eine Anfrage von xyz.domain.com mache, muss ich wählen xyz Datenbank für die Datenquelle (wir verwenden Wildcard-Subdomain am Frontend, so dass es mehrere solche Subdomains sein wird).

Ich habe versucht, Middleware zu erstellen, die die Subdomain von jedem Anfrageursprung extrahiert und die Datenbank für die Datenquelle einstellt. Das Problem ist jetzt nach wenigen gleichzeitigen Anfragen, Loopback-Server bricht mit „zu vielen Verbindungen“ Fehlern (sein kann, weil es bei jeder Anfrage neue Anschlussgewinde zu schaffen)

(I my-SQL-Anschluss für Datenquelle verwenden)

Es folgt mein Middleware-Code

'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(); 
 
    }; 
 
};

Andere Ansätze Dies kann ein zu erreichen Auch hilfreich sein.

+0

Vielleicht 'mit app.datasources' Erstellung stattdessen neue Datenquelle Fixes Das Problem –

+0

Aber wie kann ich den DB-Namen ändern, wenn ich 'app.datasoures' direkt benutze –

Antwort

0

app.datasources enthält alle Datenquellen, die Sie in der Anwendung definieren.

Zum Beispiel:

//datasources.json

{ 
    "memo": { 
    "name": "memo", 
    "connector": "memory" 
    }, 
    "admin": { 
    "host": "localhost", 
    "port": 27017, 
    "url": "", 
    "database": "test_db", 
    "password": "", 
    "name": "admin", 
    "user": "", 
    "connector": "mongodb" 
    } 

Dann im Code-Check für Sub-Domain und:

... 
if (subdomain === 'admin'){ 
    models.forEach(function(model) { 
     if (model.modelName !== 'Email') { 
      model.attachTo(app.datasources.admin); 
     } 
     }); 
} 
... 
Verwandte Themen