2016-08-18 5 views
2

Ich möchte Modelle unabhängig von einer bestimmten Verbindungskonfiguration deklarieren.Wie trennt man Modelldeklaration von Datenbankverbindung?

Ein theoretisches Code würde wie folgt aussehen:

const connection = require('bookshelf')(knex); 

// Declare User model. 
const User = require('bookshelf') 
    .Model 
    .extend({ 
    tableName: 'user' 
}); 

// Fetch data for data model using a specific instance of Bookshelf. 
User 
    .use(connection) 
    .fetchAll(); 

.use ist eine made-up-Methode. Ich kann keine gleichwertige Methode in API finden.

Der Grund für dieses Trennungsniveau besteht darin, isolierte Tests zu ermöglichen.

Antwort

-1

Ich glaube, Ihr Problem ist ein Konfigurationsproblem und kein Problem mit dem Bücherregal. Ich denke, Ihre beste Vorgehensweise besteht darin, zunächst Umgebungsvariablen im Knoten zu verwenden, um Ihre Datenbankverbindungszeichenfolge zu speichern. Die Idee ist eine spezifische Konfiguration für verschiedene Umgebungen (Dev, Test, Stage, Prod usw.), getrennt von der eigentlichen Codebasis. Es gibt viele Möglichkeiten, Umgebungsvariablen im Knoten zu verwenden, daher werde ich nicht auf alle eingehen. Ein paar gute sind dotenv und node-foreman. Wir verwenden Knoten-Vorarbeiter, da wir hauptsächlich auf Heroku laufen. Ich habe eine .env-Datei, die Konfigurationsoptionen enthält, die NICHT in git eingecheckt sind. node-Vorarbeiter unterstützt json .env Dateien, so meins etwas würde wie folgt aussehen:

{ 
    "DATABASE_URL": "postgres://user:[email protected]:port/schema", 
    "LOG_LEVEL": "DEBUG" 
} 

Es könnte mehr als das ist, aber Sie bekommen die Idee. Ich würde mehrere .env-Dateien für verschiedene Umgebungen haben (d. H. Env.dev, .env.test, .env.stage usw.). Wieder da ich node-Vorarbeiter verwenden, ich starten diese mit nf start die die .env Datei verwendet standardmäßig, aber Sie die Option -e wie so verwenden können: nf -e .env.test start

Sie dann Zugriff auf diese Konfiguration mit process.env in Ihrer Anwendung. Sie könnten dann haben db.js:

Sie benötigen dann diese Datei, wo Sie es in Ihrer Modelldatei benötigen. So könnte dies in usermodel.js gehen:

const bookshelf = require('./db').bookshelf; 
const User = bookshelf 
    .Model 
    .extend({ 
    tableName: 'user' 
}); 

module.exports = { 
    User, 
} 

Dann in Ihrem app.js (oder wo auch immer Sie benötigen Benutzer abfragen):

const User = require('./usermodel').User; 
User.fetchAll(); 

Also, wenn Sie dies einrichten, Sie Starten Sie einfach Ihre App mit einer anderen Konfiguration mit nf -e .env.whatever

+0

Abhängigkeit von einem Service macht diese Tests "Service Integration Tests", keine Unit-Tests. Dies löst ein anderes Problem. – Gajus

+0

Sie müssen nicht dotenv oder foreman verwenden, um Umgebungsvariablen einzurichten. Es macht es einfach einfacher. Willst du es ohne die Abhängigkeit tun? Führen Sie Folgendes aus: DATABASE_URL = "postgres: // Benutzer: pass @ Host: Port/Schema" Npm Start – ricka

Verwandte Themen