Estou usando o express para criar um aplicativo da web no node.js. Esta é uma simplificação do que tenho:
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('/');
});
Meu problema é o seguinte:
Se eu achar que os dados enviados /category
não são validados, gostaria de passar algum contexto adicional para a /
página. Como eu pude fazer isso? O redirecionamento não parece permitir nenhum tipo de parâmetro extra.
flash
: stackoverflow.com/questions/12442716/…/
página. Há uma/
rota, que pode expressar serviço, e há um modelo de página inicial, que pode expressar. Se você deseja preservar alguns dados para renderizar o modelo da página inicial após um redirecionamento, a resposta aceita, não obstante, as sessões são suas amigas. Eles oferecem a você um armazenamento de dados que persiste em solicitações e respostas para usuários de navegação individuais, para que você possa inserir dados durante o/category
manuseio e retirá-lo, se houver, durante o manuseio/
.Respostas:
Existem algumas maneiras de transmitir dados para diferentes rotas. A resposta mais correta é, é claro, as cadeias de consulta. Você precisará garantir que os valores sejam codificados corretamenteURIComponent e decodeURIComponent .
Você pode pegar isso na sua outra rota obtendo os parâmetros enviados usando
req.query
.Para uma maneira mais dinâmica, você pode usar o
url
módulo principal para gerar a sequência de consultas para você:Portanto, se você deseja redirecionar todas as variáveis de sequência de consulta de consulta, você pode simplesmente fazer
E se você estiver usando Nó> = 7.x, também poderá usar o
querystring
módulo principalOutra maneira de fazer isso é configurando algo na sessão. Você pode ler como configurá-lo aqui , mas configurar e acessar variáveis é algo como isto:
E depois depois do redirecionamento ...
Também há a opção de usar um recurso antigo do Express
req.flash
,. Para fazer isso nas versões mais recentes do Express, será necessário o uso de outra biblioteca. Essencialmente, ele permite que você configure variáveis que serão exibidas e redefinidas na próxima vez que você acessar uma página. É útil para mostrar erros aos usuários, mas novamente foi removido por padrão. EDIT: Encontrou uma biblioteca que adiciona essa funcionalidade.Espero que isso lhe dê uma idéia geral de como transmitir informações em um aplicativo Express.
fonte
/
rota principal . Outra opção é chamar a rota de postagem via AJAX e armazenar os dados resultantes no armazenamento local ou algo semelhante.A maneira mais fácil que encontrei de passar dados entre routeHandlers para
next()
não precisar mexer com redirecionamento ou sessões. Opcionalmente, você pode chamar o seu emhomeCtrl(req,res)
vez denext()
e apenas passar oreq
eres
fonte
/
Eu tive que encontrar outra solução porque nenhuma das soluções fornecidas realmente atendeu aos meus requisitos, pelos seguintes motivos:
Cadeias de consulta : talvez você não queira usar cadeias de consulta porque os URLs podem ser compartilhados por seus usuários e, às vezes, os parâmetros de consulta não fazem sentido para um usuário diferente. Por exemplo, um erro como
?error=sessionExpired
nunca deve ser exibido para outro usuário por acidente.req.session : talvez você não queira usá-
req.session
lo porque precisa da dependência de sessão expressa para isso, que inclui a configuração de um armazenamento de sessão (como o MongoDB), que talvez você não precise, ou talvez já esteja usando um recurso personalizado. solução de armazenamento de sessão.next () : você pode não querer usar
next()
ounext("router")
porque isso essencialmente renderiza sua nova página no URL original, não é realmente um redirecionamento para o novo URL, mais como um encaminhamento / reescrita, o que pode não ser aceitável.Portanto, esta é a minha quarta solução que não sofre com nenhum dos problemas anteriores. Basicamente, envolve o uso de um cookie temporário, para o qual você deverá primeiro instalar o analisador de cookies . Obviamente, isso significa que ele só funcionará onde os cookies estiverem ativados e com uma quantidade limitada de dados.
Exemplo de implementação:
fonte
express-session
. Um banco de dados apenas faz as sessões persistirem entre as reinicializações do servidor.use app.set & app.get
Configurando dados
Obtendo dados
fonte
Aqui está o que eu sugiro sem usar nenhuma outra dependência, apenas node e express, use app.locals, aqui está um exemplo:
fonte
Você pode transmitir pequenos bits de dados de pares de chave / valor através da string de consulta:
E o javascript na página inicial pode acessar isso e ajustar seu comportamento de acordo.
Observe que, se você não se importa em
/category
permanecer como o URL na barra de endereço do navegador, pode renderizar diretamente, em vez de redirecionar. O IMHO muitas vezes as pessoas usam redirecionamentos porque estruturas da Web mais antigas dificultam a resposta direta, mas é fácil de expressar:Como o @ Dropped.on.Caprica comentou, o uso do AJAX elimina a preocupação de alteração de URL.
fonte
podemos usar sessão expressa para enviar os dados necessários
quando você inicializa o aplicativo
então, antes do redirecionamento, salve o contexto da sessão
Agora você pode obter o contexto em qualquer lugar da sessão. ele pode ser obtido apenas por req.session.context
fonte