Estoy usando express para hacer una aplicación web en node.js. Esta es una simplificación de lo que tengo:
var express = require('express');
var jade = require('jade');
var http = require("http");
var app = express();
var server = http.createServer(app);
app.get('/', function(req, res) {
// Prepare the context
res.render('home.jade', context);
});
app.post('/category', function(req, res) {
// Process the data received in req.body
res.redirect('/');
});
Mi problema es el siguiente:
Si encuentro que los datos enviados /category
no se validan, me gustaría pasar algún contexto adicional a la /
página. ¿Cómo podría hacer esto? Redirect no parece permitir ningún tipo de parámetro adicional.
flash
: stackoverflow.com/questions/12442716/…/
página. Hay una/
ruta, que express puede servir, y hay una plantilla de página de inicio, que express puede representar. Si desea conservar algunos datos para representar la plantilla de la página de inicio después de una redirección, a pesar de la respuesta aceptada, las sesiones son su amigo. Le brindan un almacén de datos que persiste en todas las solicitudes y respuestas para usuarios de navegación individuales para que pueda ingresar datos durante el/category
manejo y luego eliminarlos si están allí durante la/
entrega.Respuestas:
Hay algunas formas de pasar datos a diferentes rutas. La respuesta más correcta es, por supuesto, las cadenas de consulta. Deberá asegurarse de que los valores estén correctamente encodeURIComponent y decodeURIComponent .
Puede enganchar eso en su otra ruta al obtener los parámetros enviados mediante
req.query
.Para una forma más dinámica, puede usar el
url
módulo central para generar la cadena de consulta por usted:Entonces, si desea redirigir todas las variables de cadena de consulta de solicitud, simplemente puede hacer
Y si está usando Nodo> = 7.x también puede usar el
querystring
módulo centralOtra forma de hacerlo es configurando algo en la sesión. Puede leer cómo configurarlo aquí , pero configurar y acceder a las variables es algo como esto:
Y más tarde después de la redirección ...
También existe la opción de usar una característica antigua de Express,
req.flash
. Hacerlo en versiones más nuevas de Express requerirá que uses otra biblioteca. Esencialmente, le permite configurar variables que se mostrarán y restablecerán la próxima vez que vaya a una página. Es útil para mostrar errores a los usuarios, pero nuevamente se ha eliminado de forma predeterminada. EDITAR: se encontró una biblioteca que agrega esta funcionalidad.Con suerte, eso le dará una idea general de cómo pasar información en una aplicación Express.
fuente
/
ruta principal . Otra opción es llamar a la ruta posterior a través de AJAX y almacenar los datos resultantes en almacenamiento local o algo similar.La forma más fácil que he encontrado para pasar datos entre routeHandlers para usar
next()
no es necesario meterse con la redirección o las sesiones. Opcionalmente, puede llamar a su enhomeCtrl(req,res)
lugar denext()
y simplemente pasar elreq
yres
fuente
/
Tuve que encontrar otra solución porque ninguna de las soluciones proporcionadas realmente cumplió con mis requisitos, por las siguientes razones:
Cadenas de consulta : es posible que no desee utilizar cadenas de consulta porque los usuarios podrían compartir las URL y, a veces, los parámetros de consulta no tienen sentido para un usuario diferente. Por ejemplo, un error como
?error=sessionExpired
nunca debe mostrarse a otro usuario por accidente.sesión requerida : es posible que no desee usarlo
req.session
porque necesita la dependencia de sesión rápida para esto, lo que incluye la configuración de un almacén de sesión (como MongoDB), que puede que no necesite en absoluto, o tal vez ya esté utilizando una costumbre solución de tienda de sesión.siguiente () : es posible que no desee utilizarlo
next()
o,next("router")
debido a que esto esencialmente solo representa su nueva página bajo la URL original, en realidad no es una redirección a la nueva URL, más como un reenvío / reescritura, que puede no ser aceptable.Así que esta es mi cuarta solución que no sufre ninguno de los problemas anteriores. Básicamente implica el uso de una cookie temporal, para lo cual primero deberá instalar el analizador de cookies . Obviamente, esto significa que solo funcionará cuando las cookies estén habilitadas y con una cantidad limitada de datos.
Ejemplo de implementación:
fuente
express-session
. Una base de datos solo hace que las sesiones persistan en los reinicios del servidor.use app.set y app.get
Establecer datos
Obteniendo datos
fuente
Esto es lo que sugiero sin usar ninguna otra dependencia, solo nodo y express, use app.locals, aquí hay un ejemplo:
fuente
Puede pasar pequeños bits de datos de pares clave / valor a través de la cadena de consulta:
Y JavaScript en la página de inicio puede acceder a eso y ajustar su comportamiento en consecuencia.
Tenga en cuenta que si no le importa
/category
quedarse como la URL en la barra de direcciones del navegador, puede renderizar directamente en lugar de redirigir. En mi humilde opinión, muchas veces las personas usan redireccionamientos porque los marcos web más antiguos dificultaban la respuesta directa, pero es fácil de expresar:Como comentó @ Dropped.on.Caprica, el uso de AJAX elimina la preocupación de cambio de URL.
fuente
podemos usar la sesión express para enviar los datos requeridos
cuando inicializa la aplicación
así que antes de la redirección solo guarde el contexto para la sesión
Ahora puede obtener el contexto en cualquier lugar para la sesión. se puede obtener solo por req.session.context
fuente