2016-09-28 5 views
1

Informations généralesnode.js/application expresse - où dois-je mettre la logique de connexion à la base de données?

Je viens de créer ma première application expresse. Je peux voir que cela a créé un tas de fichiers et la structure de dossiers par défaut. C'est ce que ma structure d'application ressemble actuellement:

[email protected]:/var/www/html/nodejs_samples/tutorial1$ ls -lah 
total 36K 
drwxr-xr-x 7 me me 4.0K Sep 28 09:26 . 
drwxrwxr-x 5 me me 4.0K Sep 28 08:45 .. 
-rw-rw-r-- 1 me me 1.5K Sep 28 08:45 app.js 
drwxr-xr-x 2 me me 4.0K Sep 28 09:20 bin 
drwxrwxr-x 96 me me 4.0K Sep 28 09:26 node_modules 
-rw-rw-r-- 1 me me 352 Sep 28 09:26 package.json 
drwxr-xr-x 5 me me 4.0K Sep 28 08:45 public 
drwxr-xr-x 2 me me 4.0K Sep 28 09:26 routes 
drwxr-xr-x 2 me me 4.0K Sep 28 08:45 views 
[email protected]:/var/www/html/nodejs_samples/tutorial1$ 

Objectif

Je veux créer une nouvelle route appelée « widgets » et lorsque la méthode GET est invoquée, je dois appeler une base de données Redis et exécutez une requête. L'URL que je veux utiliser pour déclencher ce get est quelque chose comme ceci:

http://myserver/tutorial1/widgets/ 

ou

http://myserver/tutorial1/widgets/12345 

où est la clé 12345 widget que je veux interroger.

Ce que je l'ai fait jusqu'à présent

J'ai trouvé ce document qui explique comment connecter/interroger une base de données Redis: http://expressjs.com/en/guide/database-integration.html#redis

J'ai aussi copié les routes/users.js que l'express générateur créé "gratuitement" pour moi à routes/widgets.js comme point de départ.

C'est ce que mes itinéraires/fichier widgets.js ressemble:

[email protected]:/var/www/html/nodejs_samples/tutorial1$ cat routes/widgets.js 
var express = require('express'); 
var router = express.Router(); 

/* GET widgets listing. */ 
router.get('/', function(req, res, next) { 
    res.send('respond with a resource'); 
}); 

module.exports = router; 

Question

Il est pas clair pour moi où je dois ajouter la logique de connexion de base de données et la logique de la requête. Je suis habitué à MVC où vous divisez toute la logique de base de données dans le modèle. Puis-je tout mettre dans le fichier route/widgets.js?

Si cela vous aide, voici un lien vers mon fichier app.js: http://pastebin.com/hAe5mvwt. J'ai ajouté 2 lignes - ligne 10 et 28.

Des suggestions ou des liens vers de bons tutoriels seraient appréciés.

+0

Vous * pouvez *, mais il est couplé directement au gestionnaire d'itinéraire. C'est bien de commencer comme ça, mais je préfère une séparation plus forte des préoccupations. En fin de compte cela se résume à l'opinion: il n'y a pas de «bonne» façon de casser la fonctionnalité. –

Répondre

0

La réponse courte est oui, MVC fonctionne bien et la base de données peut certainement entrer dans le modèle. Mais, il existe de nombreuses façons de peler un chat. Avec quelque chose d'assez trivial à ce stade, je pense que vous devriez faire ce qui vous convient et vous sentir comme un design raisonnablement propre.

Le problème est que votre système devenant plus complexe, vous avez besoin d'un moyen de l'évoluer en douceur. Vous n'allez jamais avoir le «meilleur» design final parce que les réalités changent au fur et à mesure.

Assurez-vous de regarder node-modules.com, npmjs.com, npms.io d'abord pour explorer les nombreuses conceptions puissantes (et assez variées) déjà mises en œuvre et populaires.

Je pense que vous devriez explorer, si vous avez le temps, plusieurs stratégies différentes pour organiser votre code. Le plus gros problème est, comment pouvez-vous éventuellement changer cette conception sur la route (vous volonté vouloir changer finalement) sans casser complètement votre application (et ne pas le savoir)?

Donc, je pense que plutôt que de trop s'inquiéter de l'organisation du code maintenant, dépensez autant d'efforts pour trouver des moyens de tester automatiquement autant que possible. De cette façon, lorsque vous modifiez le design, vous serez en mesure de voir ce qui s'est cassé - et il sera donc possible de changer le design. Dans la mesure du possible, vous voulez des tests unitaires, sinon des tests d'intégration, des tests de bout en bout de plus grande taille.

Si vous pouvez mettre quelque chose dans son propre module/fichier de modèle/peu importe et le tester séparément en tant qu'unité, c'est mieux que d'autres conceptions probablement.

+0

J'aime beaucoup votre suggestion. Séparer le code en unités testables est un bon principe général à garder à l'esprit. Je suppose que je vais commencer par tout mettre dans le fichier des routes spécifiques ... juste pour apprendre le nœud et exprimer ... et puis une fois que je le connaîtrai ... peut-être mettre sur le chapeau de test et revisiter mon échantillon code pour voir quel genre de refactoring serait le mieux soutenir les tests. – Happydevdays