En este tutorial vamos a crear un blog impulsado por Node.js en el back-end, Bootstrap en el front-end y MongoDB como almacén de datos. Vamos a empezar desde cero y construir el proyecto paso a paso. Veremos cómo incluir todos los paquetes que necesitaremos en Node para crear el blog. Algunos de estos incluyen Express, Bcrypt, nodemon, express-edge, mongoose, body-parser, express-fileupload y express-session. Comenzaremos con las rutas básicas en el archivo index.js y luego trasladaremos gradualmente la aplicación a una arquitectura Model View Controller. Empecemos.


Configuración del proyecto de blog

En nuestra terminal, podemos crear nuestro directorio y ejecutarlo npm initpara comenzar.

node $ mkdir nodejs-blog-tutorial
node $ cd nodejs-blog-tutorial
nodejs-blog-tutorial $ npm init
Esta utilidad lo guiará a través de la creación de un archivo package.json.
Solo cubre los elementos más comunes e intenta adivinar valores predeterminados razonables.

Consulte la npm help jsondocumentación definitiva sobre estos campos.
y exactamente lo que hacen.

Úselo luego para instalar un paquete ynpm install 
guárdelo como una dependencia en el archivo package.json.

Presione ^ C en cualquier momento para salir.
nombre del paquete: (nodejs-blog-tutorial)
versión: (1.0.0)
descripción: Crea un blog usando Node.js
punto de entrada: (index.js)
comando de prueba:
repositorio git:
palabras clave: blog
autor:
licencia: (ISC)
A punto de escribir en C: nodenodejs-blog-tutorialpackage.json:

{
  "nombre": "nodejs-blog-tutorial",
  "versión": "1.0.0",
  "description": "Crea un blog usando Node.js",
  "main": "index.js",
  "guiones": {
    "test": "echo" Error: no se ha especificado ninguna prueba "&& exit 1"
  },
  "palabras clave": [
    "Blog"
  ],
  "autor": "",
  "licencia": "ISC"
}


¿Esta bien? (si)

Excelente. Ahora, instalaremos un buen tema Bootstrap de la buena gente de Start Bootstrap.

nodejs-blog-tutorial $ npm i iniciobootstrap-clean-blog
npm notice creó un archivo de bloqueo como package-lock.json. Debe enviar este archivo.npm WARN bootstrap@4.1.1 requiere un par de popper.js@^1.14.3 pero ninguno está instalado. Debe instalar las dependencias de pares usted mismo.
npm WARN nodejs-blog-tutorial@1.0.0 Sin campo de repositorio.

+ startbootstrap-clean-blog@4.1.1
agregó 4 paquetes de 10 contribuidores y auditó 4 paquetes en 5.224s
encontrado 0 vulnerabilidades

Tenga en cuenta que el paquete vive en el node_modulesdirectorio.
npm instalar startbootstrap-clean-blog

También vamos a necesitar Express, así que vamos a instalarlo.

nodejs-blog-tutorial $ npm i express
npm WARN bootstrap@4.1.1 requiere un par de popper.js@^1.14.3 pero ninguno está instalado. Debe instalar las dependencias de pares usted mismo.npm WARN nodejs-blog-tutorial@1.0.0 Sin campo de repositorio.

+ express@4.16.3
agregó 50 paquetes de 47 contribuyentes y auditó 123 paquetes en 4.111s
encontrado 0 vulnerabilidades

Mientras estamos en eso, podemos instalar nodemon para la recarga en caliente de nuestros archivos JavaScript. No es necesario tener que detener y reiniciar manualmente su aplicación de nodo constantemente.

nodejs-blog-tutorial $ npm i nodemon

Ahora agreguemos el punto de entrada a nuestro proyecto de blog node.js que es index.js .

nodejs-blog-tutorial $ touch index.js

También necesitaremos tener un directorio público en el proyecto.

nodejs-blog-tutorial $ mkdir public

Comencemos por incluir express, configurar nuestro directorio público y lanzar el servidor.


index.js


Construyendo una página de inicio

Para comenzar a construir la página de inicio, podemos crear un pagesdirectorio para almacenar archivos estáticos. Dentro de ese directorio podemos comenzar con un index.htmlarchivo.

nodejs-blog-tutorial $ mkdir páginas
nodejs-blog-tutorial $ cd pages
páginas $ touch index.html

No se emocione demasiado, sé que esta página de inicio es épica.


index.html

¡Vamos a mostrar esa página de inicio en el navegador ahora!


index.js

¡Esta funcionando!
página de inicio del blog

Para que las cosas se vean mucho mejor, podemos copiar el startbootstrap-clean-blogdirectorio al themedirectorio. La línea de comandos hace que esto sea rápido y fácil.

nodejs-blog-tutorial $ cp -r node_modules / tema startbootstrap-clean-blog

Tenga en cuenta que el themedirectorio tiene todo lo que necesitamos para que este blog se vea genial.
ellos carpeta para contener ui

Dado que hemos establecido el publicdirectorio donde serviremos los activos, necesitamos copiar los directorios vendor css imgjsTambién copiamos el tema index.htmlal pagesdirectorio.

nodejs-blog-tutorial $ cp -r theme / vendor public / vendor
nodejs-blog-tutorial $ cp -r theme / css public / css
nodejs-blog-tutorial $ cp -r theme / img public / img
nodejs-blog-tutorial $ cp -r theme / js public / js
nodejs-blog-tutorial $ cp -r theme / index.html pages / index.html
nodejs-blog-tutorial $ node index.js
Aplicación escuchando en el puerto 4000

Una vez que iniciamos el servidor y cargamos la página de inicio - ¡Guau! ¡Se ve bastante bien!
iniciar el blog de bootstrap clean


Agregar páginas de información, contactos y publicaciones

Primero podemos copiar about.html a nuestro pagesdirectorio.

nodejs-blog-tutorial $ cp -r theme / about.html pages / about.html

Ahora podemos agregar un controlador de ruta para atender las solicitudes /about.


index.js

Continúe y ejecute nodemon para que el servidor se reinicie cada vez que cambiemos nuestros archivos.

nodejs-blog-tutorial $ nodemon index.js
[nodemon] 1.17.5 [nodemon] para reiniciar en cualquier momento, ingrese rs[nodemon] mirando: *. *
[nodemon] iniciando la node index.js
aplicación escuchando en el puerto 4000

¡Aquí vamos! Una bonita página sobre.
blog sobre la página

Podemos hacer lo mismo con las páginas de contacto y publicación.

nodejs-blog-tutorial $ cp -r theme / contact.html pages / contact.html
nodejs-blog-tutorial $ cp -r theme / post.html pages / post.html

Agregue los nuevos controladores de ruta para /contacty me /postgusta.


index.js

¡Bingo!
página de contacto del blog

¡Excelente!
página de publicación única de blog


Motor de plantilla Edge con Express

Las páginas hasta ahora son estáticas. Queremos una situación más dinámica. Para esto, podemos usar el motor de plantillas Edge para usar con Express.

nodejs-blog-tutorial $ npm instalar express-edge --save

Así es como podemos especificar que ahora estamos usando el motor de plantilla Edge en index.js .


index.js

Ahora creemos el viewsdirectorio que contendrá nuestros .edgearchivos.

nodejs-blog-tutorial $ mkdir vistas
nodejs-blog-tutorial $ vistas táctiles / index.edge

En index.js , continúe y elimine este código.

Una vez que se haya eliminado el fragmento anterior, puede colocar este código en su lugar. Esto le dice a nuestra aplicación que ahora vamos a renderizar una plantilla de borde nombrada indexdesde la viewscarpeta en lugar de nuestro archivo estático original.


Diseños con Edge

Al igual que todos los demás motores de plantillas populares, podemos configurar archivos de diseño . Aquí agregamos un layoutsdirectorio dentro viewsy agregamos un app.edgearchivo.

nodejs-blog-tutorial $ mkdir vistas / diseños
nodejs-blog-tutorial $ vistas táctiles / diseños / app.edge

En app.edge, podemos agregar el marcado común que compartirán todas las páginas. El "medio" de la página se elimina y se reemplaza con @!section('content').

Ahora realmente podemos simplificar cualquier otro archivo que extienda el archivo layout.app . Por ejemplo, ahora podemos agregar este marcado a index.edge .

Aquí está el resultado en el navegador. ¡Se ve bastante bien!
Ejemplo de diseño de borde


Datos dinámicos con MongoDB

Nuestro sistema de blogs Node js utilizará MongoDB para almacenar publicaciones de blog. El objetivo es poder almacenar nuevas publicaciones de blog en MongoDB, y también recuperar publicaciones de blog de MongoDB y enviar esos datos a nuestros archivos de plantilla .edge que mostrarán los datos dinámicos. Podemos empezar instalando Mongoose.

nodejs-blog-tutorial $ npm i mangosta - guardar

Ahora podemos requerir mangosta en nuestro archivo index.js y conectarnos a la base de datos como vemos aquí. No olvide la propiedad useNewUrlParser .


Modelos de mangosta

Podemos crear un directorio dedicado para almacenar nuestros modelos Mongoose y comenzaremos con un archivo Post.js.

nodejs-blog-tutorial $ mkdir base de datos
nodejs-blog-tutorial $ cd database
base de datos $ mkdir modelos
base de datos $ modelos táctiles / Post.js

Post.js contendrá este código.


Nuevo formulario de publicación de blog

Agreguemos una página al blog donde se presenta un formulario al usuario para que pueda enviar una nueva publicación de blog.

nodejs-blog-tutorial $ vistas táctiles / create.edge

El siguiente marcado se puede colocar en el archivo create.edge .

Ahora necesitamos una ruta en index.js para presentar el formulario.

Ahora podemos visitar http: // localhost: 4000 / posts / new y tenemos un formulario para crear una nueva publicación de blog.
formulario de nueva publicación de blog


Configuración de solicitudes POST en Express

Nuestro formulario para una nueva publicación de blog enviará una solicitud POST y necesitamos configurar el código para manejar eso. También necesitaremos el paquete body-parser para leer los datos que se envían en la solicitud POST. Primero agreguemos el analizador corporal .

nodejs-blog-tutorial $ npm instalar body-parser

Ahora necesitamos usar body-parser en index.js . Los fragmentos relevantes están resaltados.

Ahora, si ingresa algunos datos en el formulario, notará que podemos inspeccionarlos en la consola si enviamos el formulario. ¡Agradable!

[nodemon] comenzando node index.js
Aplicación escuchando en el puerto 4000
{title: 'Este es el campo del título',
  descripción: 'Aquí está el campo de descripción',
  contenido: 'El contenido de la publicación está aquí'}

Almacenar nueva publicación de blog en MongoDB

Ahora que estamos obteniendo los datos del formulario, tenemos que hacer algo con ellos. Queremos almacenarlo en la base de datos. Usaremos el modelo Post.js que habíamos creado anteriormente.

Ahora podemos actualizar el /posts/storesimilar.

Eso debería ser suficiente para almacenar una nueva publicación en la base de datos. Continúe y complete el nuevo formulario de publicación de blog, luego haga clic en Enviar. Entonces podemos usar Compass para verificarlo y nuestros datos están allí.
publicaciones de blog de nodo en brújula


Visualización de publicaciones de blog desde la base de datos

Ahora podemos eliminar las páginas "estáticas" que representaban publicaciones de blog de antes y usar datos dinámicos de MongoDB para mostrar publicaciones de blog. Podemos modificar la /ruta para obtener ahora datos de MongoDB. Luego, pasaremos esos datos al archivo index.edge.

El archivo index.edge ahora debe arreglarse para tener en cuenta los datos dinámicos en lugar del marcado estático que teníamos antes. Usamos la @eachdirectiva en Edge para hacer esto. Esto nos permite recorrer varias publicaciones de blog almacenadas en la base de datos y mostrarlas.

Agregamos una segunda publicación de blog a la base de datos, ahora veamos la página de inicio. ¡Agradable! Ahora podemos ver el título de dos publicaciones de blog gracias a nuestro @eachbucle.
mostrar varias publicaciones de blog


Visualización de una sola publicación de blog

Ahora que tenemos la página de inicio ordenada que puede mostrar todas las publicaciones, configuremos la capacidad de hacer clic en una sola publicación y ver su contenido. En primer lugar, necesitamos modificar la /postruta a lo siguiente.

Ahora debemos hacer que se pueda hacer clic en los enlaces en el archivo index.edge para que podamos hacer clic en un título y ser llevados a la vista de publicación única. Tenga en cuenta la adición de la etiqueta de anclaje que enlaza con la identificación de publicación única de cada publicación de blog.

Ahora, cuando pasamos el cursor sobre el enlace en la página principal, observe cómo el navegador nos muestra que está enlazando al objectid de esa publicación de blog.
enlace al ID de objeto de cada publicación del blog

Ahora actualice el archivo post.edge para mostrar la publicación del blog de forma dinámica.

Ahora podemos hacer clic fácilmente en el título de cualquier publicación de blog y se nos lleva a esa publicación en particular para verla.
haga clic en objectid para visitar la publicación del blog


Agregar nombre de usuario y creado en a publicaciones de blog

Las publicaciones de blog deben tener un nombre de usuario asociado, así como una fecha de creación. Podemos actualizar el modelo de Post.js para reflejar esto.

Necesitaremos ajustar nuestro archivo create.edge para que se adapte al nombre de usuario.

Antes de agregar nuevas publicaciones de blog, continúe y elimine la base de datos de Mongo usando el shell de línea de comando.

> mongo
> usar node-blog
cambió a db node-blog
> db.dropDatabase ()
{"drop": "node-blog", "ok": 1}
>

Ahora podemos agregar algunas publicaciones de blog nuevas a una nueva base de datos visitando http: // localhost: 4000 / posts / new y si marcamos Compass podemos ver las nuevas propiedades en nuestra base de datos. Observe las propiedades createdAtusername.
nuevo esquema en la base de datos de mongo

Podemos actualizar index.edge para que podamos mostrar estos nuevos datos ahora.

Visitar la página de inicio del blog muestra que estas nuevas propiedades están funcionando muy bien.
post-metainformación del blog

Asegurémonos de que post.edge ahora también está aprovechando la información post-meta.

¡Se ve bien!
publicar meta en una sola página de publicación de blog


Cómo subir imágenes

Agreguemos la capacidad de cargar imágenes al crear una nueva publicación de blog. Podemos usar el paquete express-fileupload para ayudarnos.

nodejs-blog-tutorial $ npm install --save express-fileupload

Podemos agregar un campo para agregar una nueva imagen al crear una publicación en create.edge .

Necesitamos actualizar el modelo Post.js para permitir nuestra nueva imagen.

Necesitamos hacer algunas actualizaciones en index.js también para manejar la carga de imágenes.

También necesitamos un directorio para guardar las imágenes.

nodejs-blog-tutorial $ mkdir public / posts

Ahora, si creamos una nueva publicación e incluimos una imagen, se almacena en este directorio.
imagen almacenada en el servidor

Ahora podemos mostrar esa imagen en cada publicación que creamos actualizando post.edge .

Al ver esta publicación ahora, se ve muy bien con la imagen de fondo configurada dinámicamente.
carga de imagen utilizada en la publicación del blog


Agregar validación simple a la creación de publicaciones de blog

Todavía no tenemos ninguna forma de validar los datos antes de intentar enviar una publicación. Agreguemos un middleware para ayudar con esto.

nodejs-blog-tutorial $ mkdir middleware
nodejs-blog-tutorial $ touch middleware / storePost.js

En el archivo storePost.js , podemos agregar la validación más básica. Básicamente, solo queremos que todos los campos sean obligatorios. Si falta alguno, simplemente lo redireccionamos al formulario.

Ahora, usemos ese middleware en index.js .

¡Excelente! La validación simple ahora está funcionando.


Agregar controladores para una aplicación de controlador de vista de modelo

¿Ha notado que el archivo index.js está comenzando a hincharse mucho? Esto no es realmente ideal. Podemos solucionar esto reestructurando la aplicación a una arquitectura MVC. Podemos crear el directorio de controladores y los archivos de controlador que necesitamos ahora.

nodejs-blog-tutorial $ mkdir controllers
nodejs-blog-tutorial $ touch controllers / createPost.js
nodejs-blog-tutorial $ touch controllers / getPost.js
nodejs-blog-tutorial $ touch controllers / homePage.js
nodejs-blog-tutorial $ touch controllers / storePost.js

En esos archivos estará este código.
createPost.js

getPost.js

homePage.js

storePost.js

Con nuestros controladores en su lugar, realmente podemos simplificar index.js ahora:

¡Okay! Con MVC ahora en su lugar, ¿la aplicación todavía funciona? Creemos una nueva publicación de blog sobre Super Mario Bros.
nueva publicación de blog de super mario

¡Navegar a esa nueva publicación de blog nos muestra que todo sigue funcionando muy bien!
mvc blog en acción


Agregar registro de usuario

Agreguemos la posibilidad de que un usuario se registre en el sitio para que pueda publicar blogs. Primero podemos crear un nuevo archivo de vista para eso.

nodejs-blog-tutorial $ vistas táctiles / register.edge

En register.edge podemos agregar este marcado.

Ahora agreguemos un controlador createUser.js y agreguemos el código que necesitamos.

nodejs-blog-tutorial $ touch controllers / createUser.js

Finalmente, podemos actualizar index.js así.

Ahora necesitamos un modelo User.js para manejar usuarios.

nodejs-blog-tutorial $ touch database / models / User.js

También necesitamos un controlador storeUser.js .

nodejs-blog-tutorial $ touch controllers / storeUser.js

Ahora podemos hacer referencia a este nuevo controlador en index.js .

Bien, con todo en su lugar, intentemos crear un nuevo usuario.
Registro de nuevo usuario

Ahora podemos usar Mongo Compass para verificar y ver si nuestro nuevo usuario está allí. De hecho, el usuario está ahí, por lo que parece que está funcionando muy bien.
usuario registrado en mongodb


Configuración de inicio de sesión de usuario

Dado que los usuarios ahora pueden registrarse, también debemos darles la posibilidad de iniciar sesión. Primero hagamos un archivo login.edge .

nodejs-blog-tutorial $ vistas táctiles / login.edge

Podemos agregar este marcado a login.edge.

Ahora podemos crear el archivo de controlador login.js .

nodejs-blog-tutorial $ touch controllers / login.js

Aquí está el código para login.js .

Hagamos uso de ese nuevo loginController en index.js

¡Así tenemos una bonita página de inicio de sesión ahora!
página de inicio de sesión de usuario


Manejo de la solicitud POST de inicio de sesión

La sección anterior nos permite presentar un formulario al usuario para que pueda ingresar sus credenciales. Ahora, cuando hacen clic en el botón para iniciar sesión, necesitamos tener el código en su lugar para manejar esa solicitud POST. Primero, crearemos un controlador loginUser.js y agregaremos un código.

nodejs-blog-tutorial $ touch controllers / loginUser.js

Una vez más, necesitamos usar este controlador en index.js


Persistencia de inicios de sesión mediante sesiones

Toda la lógica anterior funciona muy bien, pero el usuario no persiste en una sesión todavía, solucionaremos eso ahora instalando express-session.

nodejs-blog-tutorial $ npm instalar sesión rápida

Luego, agregue el express-sessionpaquete a index.js .

También queremos usar ese paquete así.

Necesitamos ajustar el controlador loginUser.js para almacenar la sesión del usuario.

Con nuestra sesión ahora en su lugar, podemos poner una marca en nuestro controlador createPost.js . Si el usuario no ha iniciado sesión, podemos redirigirlo a la página de inicio de sesión. Solo mostraremos la página "Crear nueva publicación" a un usuario que haya iniciado sesión.


Almacenamiento de sesiones en MongoDB

Podemos usar el paquete connect-mongo para habilitar la capacidad de almacenar sesiones en la base de datos. Hagámoslo ahora.

nodejs-blog-tutorial $ npm me conecto-mongo

Una vez instalado, podemos actualizar index.js así.

Ahora, cuando iniciamos sesión, la información de la sesión se almacena en MongoDB. De hecho, cuando revisamos nuestra base de datos en MongoDB usando Compass, podemos ver esa nueva colección de sesiones.
almacenar sesión en mongodb


Configurar middleware de autenticación

Podemos proteger varias páginas o rutas usando middleware. Vamos a crear auth.js y añadir el código necesario.

nodejs-blog-tutorial $ touch middleware / auth.js

Ahora puede importar ese módulo a index.js y pasarlo como segundo parámetro a app.get (“/ posts / new”, createPostController).


Mensajes flash con connect-flash

Veamos si podemos configurar mensajes flash para cuando un usuario intenta enviar un formulario con errores. Usaremos el paquete connect-flash para hacer esto. Primero lo instalamos.

nodejs-blog-tutorial $ npm i conecto-flash

Importe a index.js usando:

Luego regístrelo en index.js así:

Con connect-flashen su lugar, ahora podemos usarlo en storeUser.js controlador .

El controlador createUser.js también deberá actualizarse.

Por último, para mostrar estos mensajes flash, podemos actualizar register.edge agregando este fragmento justo encima del formulario.

Ahora, si un usuario comete un error durante el proceso de registro, los errores se mostrarán solo una vez.
ejemplo de conexión flash de nodo


Impedir que los usuarios autenticados visiten las páginas de registro o de inicio de sesión

Una vez que un usuario ha iniciado sesión, ya no necesita ver las páginas de registro o inicio de sesión. Podemos aplicar un middleware para hacer cumplir esto.

nodejs-blog-tutorial $ touch middleware / redirectIfAuthenticated.js

Ahora, todo el middleware en index.js se puede actualizar así.


Mostrar solo enlaces de inicio de sesión y registro para invitados

También necesitamos una forma de mostrar condicionalmente los enlaces de inicio de sesión y registro en función de si el usuario está conectado o no. Primero, actualice index.js así.

En app.edge , solo mostramos los enlaces de inicio de sesión y registro si el usuario no ha iniciado sesión.

Ahora, un invitado verá los enlaces de registro e inicio de sesión.
el invitado ve los enlaces de registro e inicio de sesión

El usuario que ha iniciado sesión no ve esos enlaces.
el usuario que inició sesión no ve los enlaces de registro o inicio de sesión


Saliendo de tu cuenta

En primer lugar, podemos actualizar el área de navegación en app.edge así.

Agregue esta ruta a index.js .

Cree el controlador logout.js y agregue el código necesario.

nodejs-blog-tutorial $ touch controllers / logout.js

Asegúrese de importar el controlador de cierre de sesión como tal.

Esto permitirá al usuario cerrar sesión fácilmente en la aplicación.


Resumen del tutorial del blog de Node.js

Eso lo resume todo para este tutorial sobre cómo crear un blog desde cero usando Node.js y varios paquetes del ecosistema NPM. ¡Eso es para comprobarlo!