Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Express
Code

Construya un Completo Sitio Web MVC Con ExpressJS

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by Leareny Guerrero (you can also view the original English article)

En este artículo, construiremos un sitio web completo con un front-facing del lado del cliente, así como un panel de control para administrar el contenido del sitio. Como puede suponer, la versión final de trabajo de la aplicación contiene una gran cantidad de archivos diferentes. Escribí este tutorial paso a paso, siguiendo el proceso de desarrollo, pero no incluí todos y cada uno de los archivos, ya que eso haría que fuera una lectura muy larga y aburrida. Sin embargo, el código fuente está disponible en GitHub y le recomiendo que eche un vistazo.


Introducción

Express es uno de los mejores frameworks para Node. Tiene un gran soporte y un montón de características útiles. Hay muchos artículos excelentes que cubren todos los aspectos básicos. Sin embargo, esta vez quiero profundizar un poco más y compartir mi flujo de trabajo para crear un sitio web completo. En general, este artículo no es solo para Express, sino para usarlo en combinación con algunas otras excelentes herramientas que están disponibles para los desarrolladores de Node.

Supongo que está familiarizado con Nodejs, lo tiene instalado en su sistema y que probablemente ya haya creado algunas aplicaciones.

En el corazón de Express está Connect. Este es un framework de middleware, que viene con muchas cosas útiles. Si se pregunta qué es exactamente un middleware, aquí hay un ejemplo rápido:

El middleware es básicamente una función que acepta objetos de request y response y una función next. Cada middleware puede decidir responder utilizando un objeto de response o pasar el flujo a la siguiente función llamando a next de vuelta. En el ejemplo anterior, si elimina la llamada al método next() en el segundo middleware, la cadena hello world nunca se enviará al navegador. En general. así es como trabaja Express. Hay algunos middlewares predefinidos, que por supuesto le ahorran mucho tiempo.  Como por ejemplo, el Body parser que analiza cuerpos de solicitud y admite application/json, application/x-www-form-urlencoded y multipart/form-data. O el Cookies parser , que analiza los encabezados de las cookies y rellena req.cookies con un objeto codificado por el nombre de la cookie.

Express en realidad envuelve Connect y agrega nuevas funcionalidades a su alrededor.  Como por ejemplo, la lógica de enrutamiento, que hace que el proceso sea mucho más fluido.  Aquí hay un ejemplo de cómo manejar una solicitud GET: 


Preparar

Hay dos formas de configurar Express.    Lo primero es colocarlo en el archivo package.json y ejecutar la npm install (hay una broma de que npm significa que no hay problema hombre :)).

El código del framework se colocará en node_modules y podrá crear una instancia de este. Sin embargo, prefiero una opción alternativa, mediante el uso de la herramienta de línea de comandos. Simplemente instale Express globalmente con npm install -g express. Al hacer esto, ahora tiene un nuevo instrumento CLI. Por ejemplo, si ejecuta:

Express creará un esqueleto de aplicación con algunas cosas ya configuradas para usted.  Estas son las opciones de uso para el comando express(1):

Como puede ver, solo hay algunas opciones disponibles, pero para mí son suficientes.  Normalmente estoy usando less como el preprocesador CSS y hogan como el motor de plantillas. En este ejemplo, también necesitaremos soporte de sesión, por lo que el argumento--sessions resuelve ese problema. Cuando termina el comando anterior, nuestro proyecto se ve así:

Si revisa el archivo package.json, verá que todas las dependencias que necesitamos se agregan aquí. Aunque todavía no se han instalado. Para hacerlo, simplemente ejecute npm install y luego aparecerá una carpeta node_modules.

Me doy cuenta de que el enfoque anterior no siempre es apropiado. Es posible que desee colocar sus controladores de ruta en otro directorio o algo similar. Pero, como verá en los próximos capítulos, haré cambios a la estructura ya generada, lo cual es bastante fácil de hacer. Entonces debería pensar en el comando express(1) como un generador repetitivo.


FastDelivery

Para este tutorial, diseñé un sitio web simple de una compañía falsa llamada FastDelivery. Aquí hay una captura de pantalla del diseño completo: 

site

Al final de este tutorial, tendremos una aplicación web completa, con un panel de control en funcionamiento. La idea es administrar cada parte del sitio en áreas restringidas separadas. El diseño se creó en Photoshop y se cortó en archivos CSS (less) HTML (hogan). Ahora, no voy a estar cubriendo el proceso de corte, porque no es el tema de este artículo, pero si tiene alguna pregunta al respecto, no dude en preguntar. Después del corte, tenemos los siguientes archivos y la estructura de la aplicación:

Aquí hay una lista de los elementos del sitio que vamos a administrar: 

  • Home (la pancarta en el medio - título y texto) 
  • Blog (agregar, eliminar y editar artículos) 
  • Página de servicios 
  • Página de carreras 
  • Página de contactos

Configuración

Hay algunas cosas que debemos hacer antes de poder comenzar la implementación real.  La configuración de la preparación es uno de ellos. Imaginemos que nuestro pequeño sitio debe implementarse en tres lugares diferentes: un servidor local, un servidor intermedio y un servidor de producción. Por supuesto, los ajustes es para cada entorno son diferentes y deberíamos implementar un mecanismo que sea lo suficientemente flexible. Como sabes, cada script de node se ejecuta como un programa de consola. Por lo tanto, podemos enviar fácilmente argumentos de línea de comandos que definirán el entorno actual. Envolví esa parte en un módulo por separado para escribir una prueba más tarde. Aquí está el archivo /config/index.js:

Solo hay dos configuraciones (por ahora): mode y port. Como puede suponer, la aplicación utiliza diferentes puertos para los diferentes servidores.  Es por eso que tenemos que actualizar el punto de entrada del sitio, en app.js.

Para alternar entre las configuraciones, simplemente agregue el entorno al final Por ejemplo:

Producirá:

Ahora tenemos todos nuestros ajustes en un solo lugar y son fácilmente manejables.


Pruebas

Soy un gran fan de TDD. Trataré de cubrir todas las clases base utilizadas en este artículo. Por supuesto, tener pruebas para absolutamente todo hará que esta escritura sea demasiado larga, pero en general, así es como debe proceder al crear sus propias aplicaciones. Uno de mis frameworks favoritos para las pruebas es jasmine. Por supuesto, está disponible en el registro npm:

Vamos a crear un directorio de tests que contendrá nuestras pruebas. Lo primero que vamos a verificar es nuestra configuración de preparar.  Los archivos de especificaciones deben terminar con .spec.js, por lo que el archivo se debe llamar config.spec.js.

Ejecuta jasmine-node ./tests y deberías ver lo siguiente:

Esta vez, escribí la implementación primero y la prueba de  segunda. Esa no es exactamente la manera TDD de hacer las cosas, pero en los próximos capítulos haré lo contrario.

Recomiendo pasar una buena cantidad de tiempo escribiendo pruebas. No hay nada mejor que una aplicación completamente probada. 

Hace un par de años me di cuenta de algo muy importante que puede ayudarlo a producir mejores programas.  Cada vez que comiences a escribir una nueva clase, un nuevo módulo o simplemente una nueva pieza lógica, pregúntate: 

¿Cómo puedo probar esto?

La respuesta a esta pregunta lo ayudará a codificar de manera mucho más eficientemente, crear mejores API y colocar todo en bloques bien separados. No puedes escribir pruebas para el código de spaghetti.  Por ejemplo, en el archivo de configuración anterior (/config/index.js) Agregué la posibilidad de enviar el mode en el constructor del módulo. Usted puede preguntarse, ¿por qué hago eso cuando la idea principal es obtener el modo de los argumentos de línea de comando? Es simple ... porque necesitaba probarlo.  Imaginemos que un mes después necesito verificar algo en una configuración de production, pero la secuencia de comandos del node se ejecuta con un parámetro de staging. No podré hacer este cambio sin esa pequeña mejora.  Ese pequeño paso anterior ahora en realidad previene problemas en el futuro. 


Base de Datos

Como estamos construyendo un sitio web dinámico, necesitamos una base de datos para almacenar nuestros datos.  Elegí usar mongodb para este tutorial. Mongo es una base de datos de documentos NoSQL.  Las instrucciones de instalación se pueden encontrar aquí y, como soy usuario de Windows, seguí la instalación de  Windows. Una vez que termine con la instalación, ejecute el daemon MongoDB, que por defecto escucha en el puerto 27017.  Entonces, en teoría, deberíamos poder conectarnos a este puerto y comunicarnos con el servidor de mongodb.  Para hacer esto desde un script de node, necesitamos un módulo/controlador mongodb. Si descargó los archivos fuente para este tutorial, el módulo ya está agregado en el archivo package.json. Si no, solo agrega "mongodb": "1.3.10" a tus dependencias y ejecuta la npm install.

A continuación, vamos a escribir una prueba, que comprueba si hay un servidor mongodb ejecutándose.  archivo /tests/mongodb.spec.js:

La devolución de llamada en el método .connect del cliente mongodb recibe un objeto db. Lo usaremos más tarde para administrar nuestros datos, lo que significa que necesitamos acceder a él dentro de nuestros modelos.  No es una buena idea crear un nuevo objeto MongoClient cada vez que tengamos que realizar una solicitud a la base de datos. Es por eso que moví el funcionamiento del servidor express dentro de la devolución de llamada de la función de connect:

Aún mejor, dado que tenemos una configuración de preparar, sería una buena idea colocar el host y el puerto de mongodb allí y luego cambiar la URL de conexión a: 

Preste mucha atención al middleware: attachDB, que agregué justo antes de la llamada a la función http.createServer. Gracias a esta pequeña adición, llenaremos una propiedad .db del objeto de solicitud. La buena noticia es que podemos adjuntar varias funciones durante la definición de la ruta. Por ejemplo:

Entonces, con eso, Express llama a attachDB de antemano para llegar a nuestro manejador de ruta. Una vez que esto sucede, el objeto de solicitud tendrá la propiedad .db y podemos usarlo para acceder a la base de datos.


MVC

Todos conocemos el patrón MVC. La pregunta es cómo esto se aplica a Express.  Más o menos, es una cuestión de interpretación.  En los siguientes capítulos, crearé módulos, que actuarán como modelo, vista y controlador. 

Modelo

El modelo es lo que manejará los datos que están en nuestra aplicación.  Debería tener acceso a un objeto db, devuelto por MongoClient Nuestro modelo también debe tener un método para extenderlo, porque es posible que deseemos crear diferentes tipos de modelos.  Por ejemplo, podríamos querer un BlogModel o un ContactsModel. Entonces, necesitamos escribir una nueva especificación: /tests/base.model.spec.js, para probar estas dos características del modelo. Y recuerde, al definir estas funcionalidades antes de comenzar a codificar la implementación, podemos garantizarle que nuestro módulo hará solo lo que nosotros queremos que haga. 

En lugar de un objeto db real, decidí pasar un objeto de maqueta. Eso es porque más adelante, es posible que desee probar algo específico, que depende de la información que proviene de la base de datos.  Será mucho más fácil definir esta data manualmente. 

La implementación del método extend es un poco complicada, porque tenemos que cambiar el prototipo de module.exports, pero aún conservar el constructor original. Afortunadamente, tenemos una buena prueba ya escrita, que demuestra que nuestro código funciona.  Una versión que aprueba lo anterior, se ve así: 

Aquí, hay dos métodos de ayuda. Un setter para el objeto db y un getter para nuestra collection de base de datos.

View

La vista generará información en la pantalla.  Básicamente, la vista es una clase que envía una respuesta al navegador.  Express proporciona una forma breve de hacer esto: 

El objeto de respuesta es una envoltura, que tiene una buena API, haciendo nuestra vida más fácil.  Sin embargo, preferiría crear un módulo que encapsule esta funcionalidad.  El directorio de views predeterminado se cambiará a templates y se creará uno nuevo, que albergará la clase de vista Base. Este pequeño cambio ahora requiere otro cambio. Deberíamos notificar a Express que nuestros archivos de plantilla ahora se encuentran en otro directorio: 

Primero, definiré lo que necesito, escribiré la prueba y luego escribiré la implementación.  Necesitamos un módulo que coincida con las siguientes reglas: 

  • Su constructor debería recibir un objeto de respuesta y un nombre de plantilla. 
  • Debe tener un método de render que acepte un objeto de datos.
  • Debe ser extensible. 

Puede preguntarse por qué estoy ampliando la clase View. ¿No es solo llamar al método response.render? Bueno, en la práctica, hay casos en los que querrás enviar un encabezado diferente o quizás manipular el objeto de response de alguna manera. Como por ejemplo, al servir datos JSON: 

En lugar de hacer esto cada vez, sería bueno tener una clase HTMLView y una clase JSONView. O incluso una clase XMLView para enviar datos XML al navegador. Es mejor, si construyes un sitio web grande, ajustar esas funcionalidades en lugar de copiar y pegar el mismo código una y otra vez. 

Aquí está la especificación para /views/Base.js:

Para probar el renderizado, tuve que crear una maqueta.  En este caso, creé un objeto que imita el objeto de respuesta del Express.  En la segunda parte de la prueba, cree otra clase de View que hereda la base y aplica un método de renderizado personalizado. Aquí esta la clase/views/Base.js.

Ahora tenemos tres especificaciones en nuestro directorio de tests y si ejecuta jasmine-node ./test, el resultado debería ser:

Controlador

¿Recuerdas las rutas y cómo fueron definidas? 

El '/'después de la ruta, que en el ejemplo anterior, es en realidad el controlador. Es solo una función de middleware que acepta request, response y next.

Arriba, es cómo debería verse su controlador, en el contexto de Express.  La herramienta de línea de comandos express(1) crea un directorio llamado routes, pero en nuestro caso, es mejor que se llame controllers, así que lo cambié para reflejar este esquema de nombres.

Ya que no estamos construyendo solo una pequeña aplicación, sería inteligente si creáramos una clase base, que podemos ampliar.  Si alguna vez necesitamos pasar algún tipo de funcionalidad a todos nuestros controladores, esta clase base sería el lugar perfecto.  Una vez más, escribiré la prueba primero, así que definamos lo que necesitamos: 

  • debe tener un método extend, que acepta un objeto y devuelve una nueva instancia hija
  • la instancia hija debe tener un método de run , que es la antigua función de middleware
  • debe haber una propiedad de name, que identifica el controlador
  • deberíamos ser capaces de crear objetos independientes, basados en la clase 

Solo algunas cosas por ahora, pero podemos agregar más funcionalidades más adelante. La prueba se vería así: 

Y aquí está la implementación de /controllers/Base.js:

Por supuesto, cada clase de niños debe definir su propio método de run, junto con su propia lógica.


FastDelivery Sitio Web

Ok, tenemos un buen conjunto de clases para nuestra arquitectura MVC y hemos cubierto nuestros módulos recién creados con pruebas.  Ahora estamos listos para continuar con el sitio, de nuestra compañía falsa, FastDelivery. Imaginemos que el sitio tiene dos partes: un front-end y un panel de administración.  El front-end se usará para mostrar la información escrita en la base de datos a nuestros usuarios finales.  El panel de administración se usará para administrar esos datos. Comencemos con nuestro panel de administración (control). 

Panel de Control

Primero creemos un controlador simple que servirá como la página de administración. Archivo/controllers/Admin.js:

Al usar las clases base preescritas para nuestros controladores y vistas, podemos crear fácilmente el punto de entrada para el panel de control.  La clase View acepta un nombre de un archivo de plantilla. De acuerdo con el código anterior, el archivo debe llamarse admin.hjs y debe colocarse en/templates. El contenido se vería así: 

(Para mantener este tutorial bastante corto y en un formato fácil de leer, no voy a mostrar cada plantilla de vista individual.  Recomiendo encarecidamente que descargue el código fuente de GitHub).

Ahora, para que el controlador sea visible, debemos agregarle una ruta en app.js:

Tenga en cuenta que no estamos enviando el método Admin.run directamente como middleware. Eso es porque queremos mantener el contexto.  Si hacemos esto: 

la palabra this en Admin señalará algo más.

Proteger el Panel de Administración

Cada página que comienza con /admin debe estar protegida. Para lograr esto, vamos a utilizar el middleware de Express: Sesiones. Simplemente adjunta un objeto a la solicitud llamada session. Ahora deberíamos cambiar nuestro controlador de administración para hacer dos cosas adicionales: 

  • Debe verificar si hay una sesión disponible.  De lo contrario, muestre un formulario de inicio de sesión. 
  • Debe aceptar los datos enviados por el formulario de inicio de sesión y autorizar al usuario si el nombre de usuario y la contraseña coinciden. 

Aquí hay una pequeña función auxiliar que podemos usar para lograr esto:

Primero, tenemos una declaración que trata de reconocer al usuario a través del objeto de sesión. En segundo lugar, verificamos si se ha enviado un formulario. Si es así, los datos del formulario están disponibles en el objeto request.body que se llena con el middleware bodyParser. Luego solo comprobamos si el nombre de usuario y la contraseña coinciden. 

Y ahora aquí está el método run del controlador, que usa nuestro nuevo ayudante. Verificamos si el usuario está autorizado, mostrando el panel de control en sí, de lo contrario, mostramos la página de inicio de sesión:

Administrar Contenido

Como señalé al principio de este artículo, tenemos muchas cosas que administrar. Para simplificar el proceso, conservemos todos los datos en una sola colección. Cada registro tendrá una propiedad de title, text, picture y type. La propiedad type determinará el propietario del registro. Por ejemplo, la página de Contactos necesitará solo un registro con el type: 'contactos', mientras que la página del Blog requerirá más registros. Entonces, necesitamos tres páginas nuevas para agregar, editar y mostrar registros. Antes de lanzarnos a crear nuevas plantillas, diseñar y poner cosas nuevas en el controlador, debemos escribir nuestra clase de modelo, que se encuentra entre el servidor MongoDB y nuestra aplicación y, por supuesto, proporciona una API significativa.

El modelo se encarga de generar una identificación única para cada registro. Lo necesitaremos para actualizar la información más adelante.

Si queremos agregar un nuevo registro para nuestra página de Contactos, simplemente podemos usar:

Entonces, tenemos una buena API para administrar los datos en nuestra colección mongodb Ahora estamos listos para escribir la UI para usar esta funcionalidad. Para esta parte, el controlador de Admin deberá cambiarse bastante. Para simplificar la tarea, decidí combinar la lista de registros agregados y el formulario para agregarlos/editarlos. Como puede ver en la captura de pantalla a continuación, la parte izquierda de la página está reservada para la lista y la parte derecha para el formulario.

control-panel

Tener todo en una página significa que tenemos que centrarnos en la parte que representa la página o ser más específico, en los datos que estamos enviando a la plantilla. Es por eso que creé varias funciones auxiliares que se combinan, así: 

Se ve un poco feo, pero funciona como yo quería. El primer helper es del un  método que verifica los parámetros GET actuales y si encuentra action=delete&id= [id of the record], elimina los datos de la colección. La segunda función se llama form y es principalmente responsable de mostrar el formulario en el lado derecho de la página. Comprueba si el formulario se envía correctamente y actualiza o crea registros en la base de datos. Al final, el método de list obtiene la  información y prepara una tabla HTML, que luego se envía a la plantilla. La implementación de estos tres ayudantes se puede encontrar en el código fuente de este tutorial.

Aquí, he decidido mostrarle la función que maneja la carga del archivo: 

Si se envía un archivo, la propiedad .files del script de node del objeto de solicitud se llena con datos. En nuestro caso, tenemos el siguiente elemento HTML:

Esto significa que podríamos acceder a los datos enviados a través de req.files.picture. En el fragmento de código anterior, req.files.picture.path se usa para obtener el contenido sin procesar del archivo. Más tarde, los mismos datos se escriben en un directorio recién creado y, al final, se devuelve una URL adecuada. Todas estas operaciones son sincrónicas, pero es una buena práctica usar la versión asincrónica de readFileSync, mkdirSync y writeFileSync.

Front-End

El trabajo duro ahora está completo. El panel de administración está funcionando y tenemos una clase ContentModel, que nos da acceso a la información almacenada en la base de datos. Lo que tenemos que hacer ahora es escribir los controladores frontales y vincularlos al contenido guardado.

Aquí está el controlador para la página de inicio - /controllers/Home.js

La página de inicio necesita un registro con un tipo de home y cuatro registros con un tipo de blog. Una vez que el controlador está listo, solo tenemos que agregarle una ruta en app.js:

De nuevo, estamos adjuntando el objeto db a la request. Prácticamente el mismo flujo de trabajo que el utilizado en el panel de administración.

Las otras páginas de nuestro front-end (lado del cliente) son casi idénticas, ya que todas tienen un controlador, que obtiene datos mediante el uso de la clase de modelo y, por supuesto, una ruta definida. Hay dos situaciones interesantes que me gustaría explicar con más detalle.  El primero esta relacionado con la página del blog. Debería poder mostrar todos los artículos, pero también presentar solo uno. Entonces, tenemos que registrar dos rutas:

Ambos usan el mismo controlador: Blog, pero llaman a diferentes métodos de run. Presta atención a la cadena/blog/:id Esta ruta coincidirá con URL como /blog/4e3455635b4a6f6dccfaa1e50ee71f1cde75222b y el hash largo estará disponible en req.params.id. En otras palabras, podemos definir parámetros dinámicos. En nuestro caso, esa es la identificación del registro. Una vez que tenemos esta información, podemos crear una página única para cada artículo.

La segunda parte interesante es cómo construí las páginas de Servicios, Carreras y Contactos. Está claro que usan un solo registro de la base de datos. Si tuviéramos que crear un controlador diferente para cada página, tendríamos que copiar/pegar el mismo código y simplemente cambiar el campo de type. Sin embargo, hay una forma mejor de lograr esto al tener solo un controlador, que acepta el type en su método de run. Así que aquí están las rutas: 

Y el controller se vería así:


Despliegue 

La implementación de un sitio web basado en Express es en realidad lo mismo que implementar cualquier otra aplicación Node.js:

  • Los archivos se colocan en el servidor.
  • El proceso del node debe detenerse (si se está ejecutando).
  • Se debe ejecutar un comando de npm install para instalar las nuevas dependencias (si las hay).
  • La secuencia de comandos principal debe ejecutarse nuevamente.

Tenga en cuenta que Node todavía es bastante joven, por lo que no todo puede funcionar como lo esperaba, pero se están realizando mejoras todo el tiempo. Por ejemplo, forever garantiza que su programa Nodejs se ejecute continuamente. Puede hacer esto al emitir el siguiente comando:

Esto es lo que estoy usando en mis servidores también. Es una herramienta pequeña y agradable, pero resuelve un gran problema. Si ejecuta su aplicación solo con el node yourapp.js, una vez que su script se cierra inesperadamente, el servidor se cae. forever, simplemente reinicia la aplicación.

Ahora no soy un administrador de sistemas, pero quería compartir mi experiencia integrando aplicaciones de nodos con Apache o Nginx, porque creo que esto es de alguna manera parte del flujo de trabajo de desarrollo.

Como usted sabe, Apache normalmente se ejecuta en el puerto 80, lo que significa que si abre http://localhost o http://localhost:80 verá una página servida por su servidor Apache y lo más probable es que su script de node esté escuchando en un puerto diferente. Por lo tanto, debe agregar un host virtual que acepte las solicitudes y las envíe al puerto correcto. Por ejemplo, supongamos que quiero alojar el sitio, que acabamos de crear, en mi servidor Apache local bajo la dirección expresscompletewebsite.dev.  Lo primero que tenemos que hacer es agregar nuestro dominio al archivo de hosts.

Después de eso, tenemos que editar el archivo httpd-vhosts.conf bajo el directorio de configuración de Apache y agregar

El servidor aún acepta solicitudes en el puerto 80, pero las envía al puerto 3000, donde el nodo está escuchando.

La configuración de Nginx es mucho más fácil y, sinceramente, es una mejor opción para alojar aplicaciones basadas en Nodejs. Aún debe agregar el nombre de dominio en su archivo de hosts. Después de eso, simplemente cree un nuevo archivo en el directorio /sites-enabled bajo la instalación de Nginx. El contenido del archivo se vería así: 

Tenga en cuenta que no puede ejecutar tanto Apache como Nginx con la configuración de hosts anterior. Esto se debe a que ambos requieren el puerto 80. Además, es posible que desee investigar un poco más acerca de una mejor configuración del servidor si planea usar los fragmentos de código anteriores en un entorno de producción. Como dije, no soy un experto en esta área.


Conclusión

Express es un gran framework, que le brinda un buen punto de partida para comenzar a construir sus aplicaciones. Como puede ver, es una cuestión de elección sobre cómo lo extenderá y qué utilizará para construir con él. Simplifica las tareas aburridas mediante el uso de algunos buenos middlewares y deja las partes divertidas para el desarrollador.

Código fuente

El código fuente para este sitio de muestra que hemos creado está disponible en GitHub - https://github.com/tutsplus/build-complete-website-expressjs. Siéntete libre de bifurcarlo y jugar con él. Estos son los pasos para ejecutar el sitio.

  • Descargue el código fuente
  • Ir al directorio de la app
  • Ejecute la npm install
  • Ejecute el daemon mongodb
  • Ejecutar node app.js
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.