¿La mejor manera de usar OOP en Express REST API?

Estoy yendo todo y haciendo un proyecto usando solo un nodo. Ha sido muy divertido, pero a veces me pierdo un poco y quiero intentar comprenderlo porque me confundo, así que lo construyo correctamente y no me siento demasiado abrumado. De todos modos, aquí está el problema:

Tengo API REST que usa Express y mysql. Configuré mysql:

app.js

//Variables, move these to env var dbOptions = { host: config.db_config.host, user: config.db_config.user, password: config.db_config.password, port: config.db_config.port, database: config.db_config.database }; app.use(myConnection(mysql, dbOptions, 'single')); 

Luego incluyo mis rutas, las rutas de la aplicación y el middleware de registro para poder usarlas en la ruta:

app.js cont.

 var userRoute = require('./routes/users.js')(app,log); app.use('/users', userRoute); 

Eso en realidad fue un poco confuso, pero ahora lo entiendo, tengo que pasarlos al módulo para que el módulo obtenga los datos.

Luego, en mi archivo de ruta, quiero usar un objeto para poder usar la misma funcionalidad en otras rutas, pero en el archivo de usuario para usar la misma agrupación de conexiones que todo lo demás está usando, o al menos no tener que configurar arriba la conexión otra vez tengo que pasarle la respuesta y la solicitud? Tiene que haber una mejor manera de hacerlo. Es realmente feo de esa manera. Aquí está la parte relevante de

rutas / usuarios.js

 var User = require('../controllers/User.js'); module.exports = (function(app,log) { var userR = express.Router(); userR.post('/register', function(req,res){ var email = req.body.email; var password = req.body.password; var firstName = req.body.first_name; var lastName = req.body.last_name; var userId; try { var query; var status = 200; var response = ''; var newUser = { email: email, password:password, first_name: firstName, last_name: lastName, password: password }; var user = new User(req,res); user.register(newUser); ... }; 

controladores / User.js

 module.exports = function User(req,res) { this.id = 0; this.register = function(newUser){ var _this = this; var deferred = q.defer(); req.getConnection(function(err,connection){ ... 

Debe haber un patrón que me estoy perdiendo aquí. Debería poder pasar la aplicación o algo así y tener acceso a la req.getConnection, etc.

Gracias.

Aquí hay un montón de cosas, pero voy a echar un vistazo a esto.

Mi primera recomendación sería tratar de mantener sus enrutadores bastante delgados. No está etiquetado, pero supongo que el fragmento más grande de código que ha proporcionado es su enrutador. Por supuesto, hay muchas opiniones, pero si estuviera haciendo esto, esto es lo que parecería mi enrutador. Estoy asumiendo que estás usando Express 4x.

rutas / usuarios.js

 var User = require('../controllers/user.js'); var userRouter = express.Router(); userRouter.post("/register", User.register); module.exports = userRouter; 

Entonces, lo que hemos hecho aquí es eliminar la dependencia de su aplicación / log middleware.

Esto significa que su archivo principal (lo que normalmente llamo app.js) se verá así:

app.js

 var userRouter = require('./routes/users.js'); app.use('/users', userRouter); 

Aquí es también donde puede poner cualquier middleware que elija (registro, análisis de cuerpo, manejo de errores, etc.).

En las versiones posteriores de Express, el código anterior en realidad monta nuestro userRouter en “/ users”. En este caso, ahora tendrá una ruta “/ users / register”.

Así que ahora que hemos sacado parte de la lógica del enrutador, tenemos que poner eso en alguna parte. Normalmente, un enrutador hablará con un controlador, así que echemos un vistazo:

controladores / usuario.js

 var User = require("../models/user.js") var register = function(req, res, next){ var email = req.body.email; var password = req.body.password; var firstName = req.body.first_name; var lastName = req.body.last_name; var userId; var params = { email: email, password:password, first_name: firstName, last_name: lastName, password: password }; var newUser = new User(params); try { newUser.register(); // do other things... } }; module.exports = {register: register}; 

Lo primero que notará es que tendría un archivo UserModel. Al hacer esto, hemos desacoplado nuestro objeto modelo de esta ruta. Digamos, por ejemplo, que tenemos una nueva ruta de registro (tal vez uno de ellos tiene un correo electrónico + pw, el otro registro a través de FB y tenemos que almacenar cosas diferentes). ¡Deberíamos poder usar la misma función (user.register en este caso) especificada en nuestro modelo sin tener que cambiar un montón de cosas!

Ahora, esto es lo que podría parecer un UserModel:

/modelos/usuario.js

 var connection = require("../lib/connection.js"); var User = function(params){ this.email = params.email; // ...etc }; User.prototype.register = function(newUser){ connection.getConnection(function(error, connection){ //connection.doWhatever(); }); }; module.exports = User; 

Ahora hemos llegado al núcleo de tu pregunta. En la parte superior, verás que tenemos un archivo de conexión. Aquí es donde vamos a poner toda nuestra lógica relacionada con la base de datos como nuestros grupos de conexión.

/lib/connection.js

 /* This will be in some JSON config we'll say var dbOptions = { host: config.db_config.host, user: config.db_config.user, password: config.db_config.password, port: config.db_config.port, database: config.db_config.database }; */ //This will depend on which version/module/db you're using, but here's what mine looks like var MySQL = require("mysql"); var config = require("../config/db.json"); connectionPool = MySQL.createPool({host: config.db_config.host, ...}); var getConnection = function(done){ connectionPool.getConnection(done); }; module.exports = {getConnection: getConnection}; 

Entonces, en conclusión, en lugar de pasar su conexión junto con su objeto de solicitud, ahora simplemente incluimos nuestro módulo de conexión corta en el archivo de modelo en el que estemos, solicitamos una conexión y hacemos el procesamiento que necesitamos. También tenga en cuenta que tendrá que liberar las conexiones de nuevo en la piscina, pero dejaré eso como un ejercicio para usted :).

Además, normalmente escribo CoffeeScript, así que disculpe cualquier pequeño error. Déjame saber si necesitas más aclaraciones.

Saludos, Brennan