En este tutorial de tres partes, profundizaremos en la creación de una aplicación de gestión de listas de tareas pendientes en Node.js y Geddy. Esta es la última entrada de la serie, donde persistiremos nuestra que hacer
artículos a MongoDB.
Como un rápido repaso, la última vez, creamos nuestro que hacer
Recurso e hizo un trabajo para hacer una aplicación de lista, pero los datos solo existían en la memoria. En este tutorial, arreglaremos eso!
MongoDB es una base de datos del almacén de documentos NoSQL creada por la gente de 10gen. Es una gran base de datos para las aplicaciones Node porque ya almacena sus datos en un formato similar a JSON y sus consultas están escritas en JavaScript. Lo usaremos para nuestra aplicación, así que vamos a configurarlo.
Vaya a http://www.mongodb.org/downloads y descargue la última versión para su sistema operativo. Siga las instrucciones en el archivo Léame desde allí. Asegúrate de que puedes empezar mongod
(y siga adelante y déjelo funcionando durante la duración de este tutorial)
Vale la pena señalar que deberá tener Mongo ejecutándose cada vez que desee que su aplicación se ejecute. La mayoría de la gente configura esto para comenzar con su servidor usando un script de inicio o algo parecido.
¿Hecho? bien, sigamos adelante.
Para nuestra aplicación, usaremos un módulo que envuelve el controlador de base de datos nativo de mongodb. Esto simplifica enormemente el código que vamos a producir, así que vamos a instalarlo. discos compactos
en su aplicación y ejecute este comando:
npm instalar mongodb-wrapper
Si todo va bien deberías tener un mongodb-wrapper
directorio en tu nodo_módulos
directorio ahora.
Mongo es una base de datos realmente fácil de trabajar; no tiene que preocuparse por configurar tablas, columnas o bases de datos. Simplemente conectándose a una base de datos, ¡usted crea uno! Y solo agregando a una colección, usted hace una. Así que vamos a configurar esto para nuestra aplicación.
Vamos a necesitar acceso a nuestra aplicación DB en toda la aplicación, así que configuremos nuestro código en config / init.js
. Abrelo; Debe tener un aspecto como este:
// Agregue el controlador de excepción no detectada en entornos similares a prod si (geddy.config.environment! = 'Desarrollo') process.addListener ('uncaughtException', function (err) geddy.log.error (JSON.stringify (err ));); geddy.todos = []; geddy.model.adapter = ; geddy.model.adapter.Todo = require (process.cwd () + '/lib/model_adapters/todo').Todo;
Agreguemos nuestro código db en la parte superior (y eliminemos la matriz geddy.todos mientras estamos en ello):
var mongo = require ('mongodb-wrapper'); geddy.db = mongo.db ('localhost', 27017, 'todo'); geddy.db.collection ('todos'); // Agregue el controlador de excepción no detectada en entornos similares a prod si (geddy.config.environment! = 'Desarrollo') process.addListener ('uncaughtException', function (err) geddy.log.error (JSON.stringify (err ));); geddy.model.adapter = ; geddy.model.adapter.Todo = require (process.cwd () + '/lib/model_adapters/todo').Todo;
Primero, requerimos la mongodb-wrapper
módulo. Luego, configuramos nuestra base de datos y le agregamos una colección. Casi ninguna configuración en absoluto.
A Geddy realmente no le importa qué datos de fondo usas, siempre y cuando tengas un modelo de adaptador escrito para ello. Esto significa que el único código que tendrá que cambiar en su aplicación para obtener su que hacer
s en una base de datos está en el modelo de adaptador. Dicho esto, esta será una reescritura completa del adaptador, por lo que si desea mantener su antigua aplicación en memoria, deberá copiar el código en otro directorio..
Abre tu modelo de adaptador (lib / model_adapters / todo.js
) y encontrar el salvar
método. Debería verse algo como esto:
this.save = function (todo, opts, callback) if (typeof callback! = 'function') callback = function () ; var todoErrors = null; para (var i en geddy.todos) // si ya está allí, guárdalo si (geddy.todos [i] .id == todo.id) geddy.todos [i] = todo; todoErrors = geddy.model.Todo.create (todo) .errors; devolución de llamada (todoErrors, todo); todo.saved = verdadero; geddy.todos.push (todo); devolución de llamada (nula, todo);
Haz que se vea así:
this.save = function (todo, opts, callback) // a veces no necesitaremos pasar un callback si (typeof callback! = 'function') callback = function () ; // A Mongo no le gusta cuando le envías funciones // así que asegurémonos de que solo estamos usando las propiedades cleanTodo = id: todo.id, guardado: todo.saved, título: todo.title, estado : todo.status; // Revisa dos veces para ver si esto es válido todo = geddy.model.Todo.create (cleanTodo); if (! todo.isValid ()) return callback (todo.errors, null); // Compruebe si tenemos esto para hacer el ítem ya geddy.db.todos.findOne (id: todo.id, función (err, doc) if (err) return callback (err, null); // si ya tenemos la tarea pendiente, actualícela con los nuevos valores if (doc) geddy.db.todos.update (id: todo.id, cleanTodo, function (err, docs) return callback (todo.errors, todo);); // si aún no tenemos el elemento de tareas pendientes, guarde uno nuevo todo.saved = true; geddy.db.todos.save (todo, function ( err, docs) return callback (err, docs);););
No te dejes intimidar por esto; Empezamos con el más complejo primero. Recuerda que nuestro salvar
método tiene que tener en cuenta tanto nueva que hacer
s y actualizando viejos que hacer
s. Así que vamos a caminar a través de este código paso a paso.
Usamos el mismo código de devolución de llamada que hicimos antes; si no nos ha pasado una devolución de llamada, simplemente use una función vacía.
Entonces desinfectamos nuestra que hacer
ít. Tenemos que hacer esto porque nuestro que hacer
objeto tiene métodos de JavaScript en él (como salvar
), y a Mongo no le gusta cuando le pasas objetos con métodos. Así que simplemente creamos un nuevo objeto con las propiedades que nos interesan..
Luego, verificamos si el que hacer
es válida. Si no es así, llamamos a la devolución de llamada con los errores de validación. Si es así, seguimos adelante..
En caso de que ya tengamos esto. que hacer
elemento en la db, comprobamos la db para ver si un que hacer
existe Aquí es donde empezamos a utilizar el mongodb-wrapper
módulo. Nos da una API limpia para trabajar con nuestra db. Aquí estamos usando el db.todos.findOne ()
Método para encontrar un solo documento que cubra nuestra consulta. Nuestra consulta es un objeto js simple: estamos buscando un documento cuyo carné de identidad
es lo mismo que nuestro que hacer
s carné de identidad
. Si encontramos uno y no hay un error, usamos el db.todos.update ()
Método para actualizar el documento con los nuevos datos. Si no encontramos uno, usamos el db.todos.save ()
método para guardar un nuevo documento con el que hacer
datos del artículo.
En todos los casos, llamamos a una devolución de llamada cuando hayamos terminado, con todos los errores que recibimos y los documentos que nos devolvió la base de datos..
Echa un vistazo a la todos
Método, debería verse así:
this.all = function (callback) callback (null, geddy.todos);
Vamos a hacer que se vea así:
this.all = function (callback) var todos = []; geddy.db.todos.find (). sort (status: -1, title: 1). toArray (function (err, docs) // si hay un error, devuélvalo antes si (err) return callback ( err, null); // iterar a través de los documentos y crear modelos a partir de ellos para (var i in docs) todos.push (geddy.model.Todo.create (docs [i])) devolver devolución de llamada (null, todos););
Mucho más simple que el salvar
método, ¿no te parece? Usamos el db.todos.find ()
Método para obtener todos los elementos en el todos
colección. Estamos usando envoltura monogdb
api para ordenar
los resultados por estado
(en orden alfabético decreciente) y por título
(en orden alfabético ascendente). Luego lo enviamos a una matriz, lo que activa la consulta para comenzar. Una vez que recuperamos nuestros datos, verificamos si hay errores, si los hay, llamamos a la devolución de llamada con el error. Si no hay errores seguimos adelante..
Entonces, pasamos por todas las docs
(los documentos que nos devolvió mongo), crear nuevos que hacer
modelar instancias para cada uno de ellos, y empujarlos a un todos
formación. Cuando hayamos terminado allí, llamamos a la devolución de llamada, pasando en el todos
.
Eche un vistazo al método de 'carga', debería verse algo como esto:
this.load = function (id, callback) for (var i en geddy.todos) if (geddy.todos [i] .id == id) return callback (null, geddy.todos [i]); devolución de llamada (mensaje: "Para no encontrar", nulo); ;
Vamos a hacer que se vea así:
this.load = function (id, callback) var todo; // encuentra una tarea pendiente en la base de datos geddy.db.todos.findOne (id: id, function (err, doc) // si hay un error, regresa antes si (err) return callback (err, null) ; // si hay un documento, cree un modelo a partir de él si (doc) todo = geddy.model.Todo.create (doc); devolver devolución de llamada (null, todo);); ;
Este es aún más simple. Usamos el db.todos.findOne ()
Método de nuevo. Esta vez, eso es todo lo que tenemos que usar sin embargo. Si tenemos un error, llamamos a la devolución de llamada con él, si no, continuamos (¿vemos un patrón aquí todavía?). Si tenemos un documento, creamos una nueva instancia del que hacer
Modelo y llamar a la devolución de llamada con él. Eso es todo por eso.
Echa un vistazo a la retirar
Método ahora, debería verse así:
this.remove = function (id, callback) if (typeof callback! = 'function') callback = function () ; para (var i en geddy.todos) if (geddy.todos [i] .id == id) geddy.todos.splice (i, 1); devolución de llamada (nula); devolver devolución de llamada (mensaje: "Para No encontrado"); ;
Vamos a hacer que se vea así:
this.remove = function (id, callback) if (typeof callback! = 'function') callback = function () ; geddy.db.todos.remove (id: id, function (err, res) callback (err););
El método de eliminación es incluso más corto de lo que solía ser. Usamos el db.todos.remove ()
Método para eliminar cualquier documento con el pasado en carné de identidad
y llamar a la devolución de llamada con un error (si existe).
Vamos a probar nuestra aplicación: discos compactos
en el directorio de su proyecto y arranque el servidor con peluche
. Crear un nuevo que hacer
. Intente editarlo, haga que falle algunas validaciones e intente eliminarlo. Todo funciona!
Espero que hayas disfrutado aprendiendo sobre Node.js, MongoDB y especialmente Geddy. Estoy seguro de que a estas alturas ya tienes un millón de ideas para lo que podrías construir con él, y me encantaría conocerlas. Como siempre, si tiene alguna pregunta, deje un comentario aquí o abra un problema en github.