1. Instalación
Copie el código de la siguiente manera: $ NPM Install Express
O use ejecutable express (1) en cualquier lugar para instalar:
Copie el código de la siguiente manera:/# Translator Nota: Este método es muy recomendable
$ npm instalación -g express
2. Comience rápidamente
La forma más rápida de comenzar con Express es usar Executable Express (1) para generar una aplicación, como se muestra a continuación:
Crea una aplicación:
La copia del código es la siguiente:
$ npm instalación -g express
$ express /tmp /foo && cd /tmp /foo
Instalar paquete de dependencia:
La copia del código es la siguiente:
$ npm instalación -d
Inicie el servidor:
La copia del código es la siguiente:
$ node app.js
3. Crea un servidor
Para crear una instancia express.httpserver, simplemente llame al método CreateServer (). Para este ejemplo de la aplicación, podemos definir una ruta basada en acciones HTTP (verbos HTTP), tomando app.get () como ejemplo:
La copia del código es la siguiente:
var app = request ('express'). CreateServer ();
app.get ('/', function (req, res) {
res.send ('hola mundo');
});
app.listen (3000);
4. Cree un servidor HTTPS
Inicialice una instancia express.httpsServer como se indicó anteriormente. Luego lo pasamos un objeto de configuración, aceptando la clave, el certificado y otros (propiedades/métodos) mencionados en la documentación HTTPS.
La copia del código es la siguiente:
var app = request ('express'). CreateServer ({Key: ...});
V. Configuración
Express admite cualquier entorno, como la etapa del producto y la etapa de desarrollo. Los desarrolladores pueden usar el método Configure () para establecer el entorno requerido actual. Si la llamada a configurar () no contiene ningún nombre del entorno, se ejecutará en la devolución de llamada especificada en todos los entornos.
Nota del traductor: los alias como la producción/desarrollo/etapa se pueden tomar por ellos mismos, como se muestra en App.Configure en Application.js. Vea el siguiente ejemplo para el uso real.
El siguiente ejemplo solo dumpExcepciones (errores de lanzamiento) en la etapa de desarrollo y devuelve una excepción de pila. Sin embargo, en ambos entornos utilizamos MethodOverride y BodyParser. Preste atención al uso de App.router, que puede usarse (opcional) para cargar la ruta del programa. Además, la ruta también se cargará llamando a App.get (), App.post (), etc. por primera vez.
La copia del código es la siguiente:
app.configure (function () {
app.use (express.methodoverride ());
App.use (Express.BodyParser ());
App.use (App.router);
});
app.configure ('desarrollo', function () {
app.use (express.static (__ dirname + '/public'));
app.use (express.errorHandler ({dumpExceptions: true, showStack: true}));
});
app.configure ('producción', function () {
var OneYear = 31557600000;
app.use (express.static (__ dirname + '/public', {maxage: oneYear}));
app.use (express.errorHandler ());
});
Para entornos similares, puede pasar múltiples cadenas de entorno:
La copia del código es la siguiente:
app.configure ('etapa', 'prod', function () {
// config
});
Para cualquier configuración interna (#), Express proporciona métodos set (clave [, val]), habilitados (clave) y deshabilitar (clave):
Nota del traductor: Para más detalles, consulte: Application.js App.set.
La copia del código es la siguiente:
app.configure (function () {
App.set ('Vistas', __Dirname + '/Vistas');
app.set ('vistas');
// => "/Absolute/Path/To/Views"
App.enable ('alguna característica');
// equivalente a: app.set ('alguna característica', true);
app.disable ('alguna característica');
// equivalente a: app.set ('alguna característica', falso);
App.enabled ('alguna característica')
// => falso
});
Para cambiar el entorno, podemos establecer variables de entorno Node_env, como:
La copia del código es la siguiente:
$ Node_env = Production Node App.js
Esto es muy importante porque la mayoría de los mecanismos de almacenamiento en caché se activan solo durante la fase del producto.
6. Configuración
Express admite la siguiente configuración de acceso directo (fuera de la casilla):
1.BASEPATH se usa para la ruta base de aplicación de Res.Redirect (), que maneja explícitamente las aplicaciones montadas.
2. Vista Vista El directorio raíz predeterminado es CWD/Vistas
3. View Engine El procesamiento de motor Vista predeterminado (Ver archivos) no requiere el uso de sufijos
4. View Cache Habilita ver caché (habilitado en la etapa del producto)
5. CAMBIOS DE CARETO Codificación, el valor predeterminado es UTF-8
6. Case rutas sensibles rutas sensibles a la caja
7. Después de que el enrutamiento de Strit esté habilitado (en la ruta) finalización/no se ignorará (nota de traducción: es decir, App.get ('/Sofish') y App.get ('/Sofish/') será diferente)
8.Json Callback Enable Res.send () / res.json () Soporte explícito JSONP (soporte transparente JSONP)
7. Enrutamiento
Express utiliza acciones HTTP para proporcionar un conjunto de API de enrutamiento rápida y expresiva. Por ejemplo, si desea lidiar con una cuenta con una ruta de /usuario /12, podemos definir la ruta de la siguiente manera. Req.Params accede al valor asociado con los marcadores de posición con nombre.
La copia del código es la siguiente:
app.get ('/user/: id', function (req, res) {
res.send ('user' + req.params.id);
});
Una ruta es una cadena que se compila internamente en regularidad. Por ejemplo, cuando se compila /User /: ID, una versión simplificada de la expresión regular es aproximadamente la siguiente:
La copia del código es la siguiente:
// Modificar la cadena oficial
/// user // ([^//]+) //?/
Las expresiones regulares se pueden pasar y aplicar a escenarios complejos. Dado que los grupos de contenido capturados por expresiones regulares literales son anónimas, podemos acceder a ellos directamente a través de req.params. Por lo tanto, el primer conjunto de contenido que capturamos será Req.Params [0], mientras que el segundo conjunto es seguido inmediatamente por Req.Params [1].
La copia del código es la siguiente:
app.get (/^// usuarios? (?: // (/d+) (?: /./. (/d+)))?)?/, function (req, res) {
res.send (req.params);
});
Solicitudes de curl para la ruta definida anteriormente:
La copia del código es la siguiente:
$ curl http: // dev: 3000/usuario
[NULL, NULL]
$ curl http: // dev: 3000/usuarios
[NULL, NULL]
$ curl http: // dev: 3000/users/1
["1", nulo]
$ curl http: // dev: 3000/users/1..15
["1", "15"]
Aquí hay algunos ejemplos de rutas asociadas con rutas que pueden usar:
La copia del código es la siguiente:
"/usuario/: ID"
/usuario/12
"/Usuarios/: ID?"
/usuarios/5
/usuarios
"/archivos/*"
/files/jquery.js
/files/javascripts/jquery.js
"/archivo/*.*"
/files/jquery.js
/files/javascripts/jquery.js
"/usuario/: id/: operación?"
/usuario/1
/usuario/1/editar
"/Products.:Format"
/products.json
/products.xml
"/Products.:Format?"
/products.json
/products.xml
/Productos
"/user/:id.:Format?"
/usuario/12
/user/12.json
Por ejemplo, podemos usar la publicación para enviar datos JSON y usar BodyParser, un middleware que puede analizar el contenido de la solicitud JSON (u otro contenido) para devolver los datos y almacenar el resultado de retorno en req.body:
La copia del código es la siguiente:
var express = require ('express')
, App = Express.CreateServer ();
App.use (Express.BodyParser ());
app.post ('/', function (req, res) {
res.send (req.body);
});
app.listen (3000);
Por lo general, podemos usar un marcador de posición de estilo "tonto" como el usuario/: id, sin (nombre) restricciones. Sin embargo, por ejemplo, si queremos limitar la ID de usuario para que sea solo un número, entonces podríamos usar /usuario /: id ([0-9]+), que solo entrará en vigencia si el marcador de posición contiene al menos un número (adaptación, coincidencia).
8. Control de ruta de paso
Podemos controlar la siguiente ruta adaptada llamando a la función del tercer parámetro, Next (). Si no se encuentra la adaptación, el control se volverá a conectar y se llamará al middleware en secuencia en el orden agregado en uso (). El principio también se aplica a múltiples rutas definidas a la misma ruta, y se les llamará a su vez hasta que uno de ellos no llame a continuación () y decida hacer una respuesta de solicitud.
La copia del código es la siguiente:
app.get ('/users/: id?', function (req, res, next) {
var id = req.params.id;
if (id) {
// Haz algo
} demás {
próximo();
}
});
app.get ('/users', function (req, res) {
// Haz algo más
});
El método App.ALL () puede transferir fácilmente la misma lógica a todas las acciones HTTP llamándolo una vez. A continuación, lo usamos para extraer un usuario de los pseudo-datos y asignarlo a req.user.
La copia del código es la siguiente:
var express = require ('express')
, App = Express.CreateServer ();
var users = [{name: 'tj'}];
app.all ('/user/: id/: op?', function (req, res, next) {
req.user = users [req.params.id];
if (req.user) {
próximo();
} demás {
Siguiente (nuevo error ('No se puede encontrar el usuario' + req.params.id));
}
});
app.get ('/user/: id', function (req, res) {
res.send ('viendo' + req.user.name);
});
app.get ('/user/: id/edit', function (req, res) {
res.send ('editar' + req.user.name);
});
app.put ('/user/: id', function (req, res) {
res.send ('actualizar' + req.user.name);
});
app.get ('*', function (req, res) {
res.send (404, '¿Qué ???');
});
app.listen (3000);
9. Middleware
El middleware de conexión (propiedades) utilizados generalmente se acompaña de un servidor de conexión normal que se pasa a express.createServer (). como:
La copia del código es la siguiente:
var express = request ('express');
var app = express.createServer (
Express.logger ()
, Express.BodyParser ()
);
Además, dentro del bloque Configure (): este palacio progresivo (nota del traductor: risas ^^, de manera progresiva), también podemos usar convenientemente use () para agregar middleware.
La copia del código es la siguiente:
app.use (express.logger ({format: ': método: url'}));
Por lo general, el uso del middleware de conexión que puede usar ("conectar"), como este:
La copia del código es la siguiente:
var conectar = requirir ('conectar');
App.use (Connect.logger ());
App.use (Connect.BodyParser ());
Esto es algo desagradable hasta cierto punto, por lo que expresa reexportar estas propiedades de middleware, aunque son las mismas:
La copia del código es la siguiente:
app.use (express.logger ());
App.use (Express.BodyParser ());
El orden del middleware es muy importante. Cuando Connect recibe una solicitud, el primer middleware que pasamos a CreateServer () o use () irá acompañado de tres parámetros, solicitud, respuesta y una función de devolución de llamada (generalmente siguiente). Cuando se llama a Next (), será el segundo giro de middleware, y así sucesivamente. Vale la pena señalar que muchos artículos intermedios dependen unos de otros. Por ejemplo, MethodOverride () consulta el método Req.Body para detectar la sobrecarga del método HTTP. Por otro lado, BodyParser () analiza el contenido solicitado y lo almacena en req.body. Otro ejemplo es el análisis de cookies y el soporte de sesión. Primero debemos usar () CookieParser () y luego session ().
Muchas aplicaciones expresas incluyen dicha línea de App.use (App.router), que puede parecer un poco extraña. De hecho, es solo una función de middleware que contiene todas las reglas de enrutamiento definidas y realiza búsquedas de enrutamiento en función de las solicitudes de URL existentes y los métodos HTTP. Express le permite decidir su posición, pero de forma predeterminada se coloca en la parte inferior. Al cambiar la ubicación de la ruta, podemos cambiar la prioridad del middleware, por ejemplo, queremos usar el informe de error como el último middleware para que cualquier excepción pase a Next () pueda manejarse a través de él; O queremos que el servicio de archivo estático sea una prioridad menor para permitir que nuestra ruta escuche descargas de una sola solicitud de archivo estático, etc. Esto se ve así:
La copia del código es la siguiente:
app.use (express.logger (...));
App.use (Express.BodyParser (...));
app.use (express.cookieParser (...));
app.use (express.session (...));
App.use (App.router);
app.use (express.static (...));
App.use (Express.errorHandler (...));
Primero agregamos logger (), que puede contener el método Req.end () del nodo, proporcionando datos sobre nuestro tiempo de respuesta. El contenido de la solicitud se analizará (si hay datos), seguido de resolución de cookies y soporte de sesión. Al mismo tiempo, Req.Session se definirá cuando se active la ruta en App.router. En este momento, no llamamos a continuación (), por lo que el middleware estático () no sabrá sobre esta solicitud. Si se ha definido la siguiente ruta, podemos registrar varios estados, rechazar descargas y consumir puntos de descarga, etc.
La copia del código es la siguiente:
descargas var = {};
App.use (App.router);
app.use (express.static (__ dirname + '/public'));
app.get ('/*', function (req, res, next) {
var file = req.params [0];
descargas [archivo] = descargas [archivo] || 0;
descargas [archivo] ++;
próximo();
});
10. Enrutamiento de middleware
El enrutamiento puede usar el middleware del enrutador para pasar más de una función de devolución de llamada (o matriz) en sus métodos. Esta característica es muy beneficiosa para restringir el acceso, descargar datos a través del enrutamiento, etc.
Por lo general, la recuperación de datos asincrónicas puede parecer el siguiente ejemplo, usamos el parámetro: ID e intentamos cargar un usuario:
La copia del código es la siguiente:
app.get ('/user/: id', function (req, res, next) {
LoadUser (req.params.id, function (err, usuario) {
if (err) return Next (err);
res.send ('Ver usuario' + user.name);
});
});
Para garantizar principios secos y mejorar la legibilidad, podemos aplicar esta lógica a un middleware. Como se muestra a continuación, abstraer esta lógica en el middleware le permitirá reutilizarlo mientras garantiza la simplicidad de nuestro enrutamiento.
La copia del código es la siguiente:
function loadUser (req, res, next) {
// Tendrías a tu usuario de la DB
Var user = users [req.params.id];
if (usuario) {
req.user = usuario;
próximo();
} demás {
siguiente (nuevo error ('Error al cargar el usuario' + req.params.id));
}
}
app.get ('/user/: id', loadUser, function (req, res) {
res.send ('Ver usuario' + req.user.name);
});
Enrutamiento múltiple se puede aplicar a una capa más profunda de lógica en orden, como restringir el acceso a una cuenta de usuario. El siguiente ejemplo solo permite a los usuarios que han aprobado la autenticación para editar sus (sus) cuentas.
La copia del código es la siguiente:
function andresticttoself (req, res, next) {
req.authenticaticuser.id == req.user.id
? próximo()
: siguiente (nuevo error ('no autorizado'));
}
app.get ('/user/: id/edit', loadUser, andrestricttoself, function (req, res) {
res.send ('Editar usuario' + req.user.name);
});
Recuerde siempre que el enrutamiento es solo una función simple, como se muestra a continuación, podemos definir funciones que devuelvan el middleware para crear una solución más expresiva y flexible.
La copia del código es la siguiente:
función andrestrictto (rol) {
Función de retorno (Req, Res, Next) {
req.authenticateuser.role == rol
? próximo()
: siguiente (nuevo error ('no autorizado'));
}
}
app.del ('/user/: id', loadUser, andrestrictto ('admin'), function (req, res) {
res.send ('Usuario eliminado' + req.user.name);
});
La "pila" de middleware comúnmente utilizada se puede pasar a través de una matriz (que se aplicará de manera recursiva), que se puede mezclar y combinar hasta cualquier grado.
La copia del código es la siguiente:
var a = [middleware1, middleware2]
, b = [middleware3, middleware4]
, all = [a, b];
app.get ('/foo', a, function () {});
app.get ('/bar', a, function () {});
app.get ('/', a, middleware3, middleware4, function () {});
app.get ('/', a, b, function () {});
app.get ('/', all, function () {});
Para obtener el código completo de esta instancia, consulte el repositorio de ejemplo de ruta middleware.
Es posible que tengamos varias veces para "omitir" el middleware de enrutamiento restante y continuar coincidiendo con las rutas posteriores. Para hacer esto, solo necesitamos llamar a Next () con la cadena 'ruta' - Next ('ruta'). Si no hay rutas restantes coinciden con la URL solicitada, Express devolverá 404 no encontrado.
11. Método HTTP
Hasta ahora, he estado expuesto a App.get () varias veces. Además, Express también proporciona otras acciones HTTP comunes, como App.post (), App.del (), etc.
Un ejemplo común de uso posterior es enviar un formulario. A continuación, simplemente establecemos el atributo del método del formulario para publicar en HTML, y el control se asignará a la ruta definida a continuación.
La copia del código es la siguiente:
<Form Method = "Post" Action = "/">
<input type = "text" name = "user [name]" />
<input type = "text" name = "user [correo electrónico]" />
<input type = "enviar" valor = "enviar" />
</form>
De forma predeterminada, Express no sabe cómo manejar el contenido de esta solicitud, por lo que debemos agregar el Middleware BodyParser, que analizará el contenido de las solicitudes de aplicación/x-www-form-urlencoded y aplicación/json y almacenará las variables en req.body. Podemos usar este middleware como el siguiente ejemplo:
La copia del código es la siguiente:
App.use (Express.BodyParser ());
De la siguiente manera, nuestra ruta tendrá acceso al objeto Req.Body.user, y cuando se definan el nombre y el correo electrónico, contendrá estas dos propiedades (Nota de traducción: si el contenido enviado por el formulario no está vacío).
La copia del código es la siguiente:
app.post ('/', function (req, res) {
console.log (req.body.user);
res.Redirect ('Back');
});
Cuando desee usar un método como poner en un formulario, podemos usar una entrada oculta llamada _method, que puede usarse para modificar los métodos HTTP. Para hacer esto, primero necesitamos el middleware MethodOverride, que debe aparecer después de BodyParser para usar el valor de formulario contenido en su req.body.
La copia del código es la siguiente:
App.use (Express.BodyParser ());
app.use (express.methodoverride ());
¿Por qué estos métodos no son propiedad de forma predeterminada? En pocas palabras, es solo porque no es necesario para la funcionalidad completa requerida por Express. El uso de métodos depende de su aplicación, es posible que no los necesite, y el cliente aún puede usar métodos como Put and Delete, y puede usarlos directamente porque MethodOverride proporciona una muy buena solución para la forma. Aquí hay una demostración de cómo usar PUT, que puede parecer:
La copia del código es la siguiente:
<Form Method = "Post" Action = "/">
<input type = "Hidden" name = "_ Method" value = "Put" />
<input type = "text" name = "user [name]" />
<input type = "text" name = "user [correo electrónico]" />
<input type = "enviar" valor = "enviar" />
</form>
app.put ('/', function () {
console.log (req.body.user);
res.Redirect ('Back');
});
12. Manejo de errores
Express proporciona el método App.error () para que la excepción recibida se lance en una ruta o se pase a Next (ERR). El siguiente ejemplo manejará diferentes páginas basadas en una excepción específica de notificación:
La copia del código es la siguiente:
Función nofound (msg) {
this.name = 'nofound';
Error.call (this, msg);
ERROR.CAPTURESTACKTRACE (this, arguments.callee);
}
Nofound.prototype .__ proto__ = error.prototype;
app.get ('/404', function (req, res) {
arrojar nuevo nofound;
});
app.get ('/500', function (req, res) {
arrojar un nuevo error ('¡Cat de teclado!');
});
Como se describe a continuación, podemos llamar a App.error () varias veces. Aquí detectamos la instancia nofund y mostramos una página 404, o pasamos al siguiente controlador de errores. Vale la pena señalar que estos procesadores se pueden definir en cualquier lugar, porque se colocarán bajo el procesador de enrutamiento cuando escuche () se escucha. Permite definiciones dentro del bloque Configure () para que podamos usar diferentes métodos de manejo de excepciones basados en el entorno.
La copia del código es la siguiente:
app.error (function (err, req, res, next) {
if (err instanceOf nofound) {
res.render ('404.jade');
} demás {
siguiente (err);
}
});
Para la simplicidad, aquí suponemos que todos los errores de esta demostración son 500 y, por supuesto, puede elegir lo que le gusta. Al ejecutar las llamadas del sistema a un sistema de archivo como el nodo, puede recibir un error. Code con Enoent, lo que significa que "no existe dicho archivo o directorio", que podemos usar en el controlador de errores o mostrar una página especificada cuando sea necesario.
La copia del código es la siguiente:
app.error (function (err, req, res) {
res.render ('500.jade', {
Error: errar
});
});
Nuestra aplicación también puede usar el Middleware de ErrorHandler de Connect para informar excepciones. Por ejemplo, cuando queremos generar una excepción stderr en el entorno de "desarrollo", podemos usar:
La copia del código es la siguiente:
app.use (express.errorHandler ({dumpExceptions: true}));
Al mismo tiempo, durante la etapa de desarrollo, es posible que necesitemos mostrar las excepciones que pasamos y lanzamos en la página HTML elegante, para la cual podemos establecer ShowStack en verdad.
La copia del código es la siguiente:
app.use (express.errorHandler ({showStack: true, dumpExcepciones: true}));
El Middleware de ErrorHandler también puede devolver JSON cuando acepta: Aplicación/JSON existe, lo cual es muy útil para desarrollar aplicaciones que dependen en gran medida del Cliente JavaScript.
13. Preprocesamiento de parámetros de ruta
El preprocesamiento de parámetros de enrutamiento, a través de la carga de datos implícitas y la verificación de solicitudes, puede mejorar en gran medida la legibilidad de su programa. Por ejemplo, generalmente necesita obtener continuamente datos básicos de múltiples rutas. Por ejemplo, cargando un usuario con /usuario /: id, podríamos hacer esto:
La copia del código es la siguiente:
app.get ('/user/: userId', function (req, res, next) {
User.get (req.params.userid, function (err, user) {
if (err) return Next (err);
res.send ('user' + user.name);
});
});
A través del preprocesamiento, nuestros parámetros se pueden asignar a devoluciones de llamada que realizan validación, control e incluso cargan datos de la base de datos. De la siguiente manera, llamamos a App.Param () con nombres de parámetros y esperamos asignarlo a algún middleware. Como puede ver, aceptamos el parámetro ID que representa el valor del marcador de posición. Usando esto, cargamos al usuario como de costumbre y manejamos el error, y simplemente llamamos a Next () para entregar el control al siguiente preprocesador o procesador de enrutamiento.
La copia del código es la siguiente:
app.param ('userId', function (req, res, next, id) {
User.get (id, function (err, usuario) {
if (err) return Next (err);
if (! user) return Next (nuevo error ('Error al encontrar el usuario'));
req.user = usuario;
próximo();
});
});
Una vez hecho esto, lo anterior mejorará en gran medida la legibilidad de la ruta y nos permitirá compartir fácilmente la lógica a lo largo del programa:
La copia del código es la siguiente:
app.get ('/user/: userId', function (req, res) {
res.send ('user' + req.user.name);
});
14. Ver procesamiento
El archivo de vista utiliza el formato <name>. <MOTITER>, donde <geling> es el nombre del módulo requerido. Por ejemplo, LightOut.EJS le dirá al sistema View que requiera ('EJS'), y el módulo cargado debe (exportar) el método exports.compile (STR, Opciones) y devolver una función para adaptarse a Express. App.register () se puede usar para cambiar este comportamiento predeterminado para mapear las extensiones de archivos a motores específicos. Por ejemplo, "foo.html" puede ser procesado por EJS.
El siguiente ejemplo usa Jade para procesar index.html. Debido a que no usamos el diseño: Falso, el contenido procesado por index.jade se pasará a una variable local llamada cuerpo en el diseño.jade.
La copia del código es la siguiente:
app.get ('/', function (req, res) {
res.render ('index.jade', {título: 'mi sitio'});
});
La nueva configuración del motor de vista nos permite especificar el motor de plantilla predeterminado, por ejemplo, cuando usamos Jade, puede configurarlo así:
La copia del código es la siguiente:
app.set ('Ver motor', 'jade');
Permítanos manejar esto:
La copia del código es la siguiente:
res.render ('índice');
Correspondiente a:
La copia del código es la siguiente:
res.render ('index.jade');
Cuando se establece la vista del motor, la extensión es opcional, pero aún podemos mezclar el motor de la plantilla de coincidencia:
La copia del código es la siguiente:
res.render ('otra-page.ejs');
Express también proporciona configuraciones de opciones de vista, que se aplicarán a una vista cada vez que se represente, por ejemplo, si no desea usar diseños:
La copia del código es la siguiente:
app.set ('Ver opciones', {
Diseño: Falso
});
Esto se puede sobrecargar dentro de la llamada res.render () cuando sea necesario:
La copia del código es la siguiente:
res.render ('myView.ejs', {diseño: true});
Cuando es necesario cambiar un diseño, generalmente necesitamos especificar otra ruta. Por ejemplo, cuando hemos establecido el motor View en Jade y el archivo se llama ./views/mylayout.jade, simplemente podemos pasar los parámetros:
La copia del código es la siguiente:
res.render ('Page', {Layout: 'MyLayout'});
De lo contrario (nota del traductor: cuando el motor de vista no está configurado en jade u otro motor), debemos especificar una extensión:
La copia del código es la siguiente:
res.render ('Page', {Layout: 'MyLayout.jade'});
También pueden ser caminos absolutos:
La copia del código es la siguiente:
res.render ('Page', {Diseño: __dirname + '/../../mylayout.jade'});
Hay un buen ejemplo de esto: personalice las etiquetas de inicio y cierre de EJS:
La copia del código es la siguiente:
app.set ('Ver opciones', {
abierto: '{{',
cerca: '}}'
})
15. Ver piezas
El sistema de vista de Express tiene soporte incorporado para piezas y colecciones, que es equivalente a reemplazar un fragmento de documento con una "mini" vista. Ejemplo, representar repetidamente en una vista para mostrar comentarios, podemos usar el conjunto de piezas:
La copia del código es la siguiente:
parcial ('comentario', {colección: comentarios});
Si no se necesitan otras opciones o variables locales, podemos omitir todo el objeto y simplemente pasarlo a una matriz, que es equivalente a lo anterior:
La copia del código es la siguiente:
parcial ('comentario', comentarios);
En uso, el conjunto de componentes proporciona algún soporte "mágico" para variables locales de forma gratuita:
1.Firstincollection True, cuando es el primer objeto
2. Indexincollection en el objeto de recolección
3.lastinincollection True, cuando es el último objeto
4. Longitud de longitud de colección del objeto de recolección
La transferencia (generación) de variables locales tiene mayor prioridad. Al mismo tiempo, las variables locales pasadas a la vista de los padres también son adecuadas para niños. Por ejemplo, cuando usamos parcial ('Blog/Post', Publica) para representar una publicación de blog, generará una variable postal post. Hay un usuario variable local en la vista que llama a esta función, que también será válida para blog/publicación. (Nota del traductor: aquí parcial es más como el método de inclusión en PHP).
Nota: Use la colección de piezas cuidadosamente, lo que hace que una matriz de colecciones de piezas de longitud 100 sea equivalente a 100 vistas que necesitamos procesar. Para colecciones simples, es mejor repetir el incorporado en lugar de usar un colector de componentes para evitar una sobrecarga excesiva.
16. Ver búsqueda
La búsqueda de la vista se ejecuta en relación con la vista principal (ruta). Si tenemos una página de vista llamada Vistas/User/List.Jade, y Parcial ('Editar') está escrita dentro de ella, intentará cargar vistas/user/edit.jade, y parcial ('../ mensajes') cargará vistas/mensajes.jade.
El sistema View también admite la indexación de plantillas, lo que le permite usar un directorio con el mismo nombre que la vista. Por ejemplo, en una ruta, res.render ('usuarios') obtiene no vistas/usuarios.jade, es decir, vistas/usuarios/index.jade. (Nota del traductor: Primero maneje la situación de <Thath>. <MOTITER>, luego maneje la situación de <PATH>/<index. <MOTER>. Para más detalles, consulte View.js.)
Al usar el índice de vista anterior, usamos parcial ('usuarios') para referirnos a vistas/usuarios/index.jade en el mismo directorio que la vista. Al mismo tiempo, el sistema de vista intentará indexar .../los usuarios/indexar sin que llamemos parcial ('usuarios').
17. Motores de plantilla
Los siguientes son los motores de plantilla más utilizados para Express:
1.Haml: implementación de Haml
2.Jade: sucesor de Haml.js
3.EJS: JavaScript incrustado
4.CoffeekUp: plantilla basada en cafés
5. Plantillas de jQuery
18. Soporte de sesión
El soporte de sesión se puede obtener utilizando el middleware de sesión de Connect. Por esta razón, generalmente necesitamos prefacionarlo con el middleware CookieParser, que analizará y almacenará datos de cookies en req.cookies.
La copia del código es la siguiente:
app.use (express.cookieParser ());
app.use (express.session ({secret: "keyboard gat"}));
Por defecto, el middleware de sesión utiliza el almacenamiento de memoria incorporado de Connect, pero hay muchas otras implementaciones. Por ejemplo, Connect-Redis proporciona un almacenamiento de sesión de Redis, que puede usarse como lo siguiente:
La copia del código es la siguiente:
var redisStore = require ('Connect-Redis') (express);
app.use (express.cookieParser ());
app.use (express.session ({secret: "keyboard gat", store: new RedisStore}));
En este punto, las propiedades de req.session y req.sessionstore serán utilizadas por todas las rutas y el posterior middleware. Todas las propiedades de Req.Session se guardarán automáticamente en una respuesta, por ejemplo, cuando queremos agregar datos al carrito de compras:
La copia del código es la siguiente:
var redisStore = require ('Connect-Redis') (express);
App.use (Express.BodyParser ());
app.use (express.cookieParser ());
app.use (express.session ({secret: "keyboard gat", store: new RedisStore}));
app.post ('/add-to-cart', function (req, res) {
// podemos publicar varios elementos a través de un formulario
// (en algunos casos, se usa el middleware BodyParser ())
VAR items = req.body.items;
req.session.Items = items;
res.Redirect ('Back');
});
app.get ('/agregar a carto', function (req, res) {
// Al regresar, la página obtenga /agrega a cartar
// podemos verificar req.session.items && req.session.items.length
// imprime el aviso
if (req.session.items && req.session.items.length) {
req.notify ('info', 'tiene %s elementos en su carrito', req.session.items.length);
}
res.render ('carto de compras');
});
Para req.session, también tiene métodos como Sesión#Touch (), Sesión#Destroy (), Sesión#Regenerate (), etc. para mantener y operar sesiones. Para obtener más detalles, consulte la documentación de la sesión Connect.
19. Guía de actualización
Para los estudiantes que usan Express 1.x, si tiene programas importantes que deben actualizarse a 2.X para obtener un mejor soporte, consulte la Guía oficial de migración muy detallada: http://expressjs.com/guide.html#migration-guide