Saya menggunakan express untuk membuat aplikasi web di node.js. Ini adalah penyederhanaan dari apa yang saya miliki:
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('/');
});
Masalah saya adalah sebagai berikut:
Jika saya menemukan bahwa data yang dikirim /category
tidak valid, saya ingin meneruskan beberapa konteks tambahan ke /
halaman. Bagaimana saya bisa melakukan ini? Pengalihan tampaknya tidak mengizinkan segala jenis parameter tambahan.
flash
: stackoverflow.com/questions/12442716/…/
halaman. Ada/
rute, yang ekspres bisa diservis, dan ada templat beranda, yang ekspres dapat dirender. Jika Anda ingin menyimpan beberapa data untuk merender templat beranda setelah diredirect, jawaban yang diterima sekalipun, sesi adalah teman Anda. Mereka memberi Anda penyimpanan data yang bertahan di seluruh permintaan dan tanggapan untuk pengguna penelusuran individual sehingga Anda dapat memasukkan data selama/category
penanganan, dan kemudian membawanya keluar jika ada di sana saat/
menyerahkan.Jawaban:
Ada beberapa cara untuk melewatkan data ke berbagai rute. Jawaban yang paling benar tentu saja adalah string kueri. Anda harus memastikan bahwa nilainya benar encodeURIComponent dan decodeURIComponent .
Anda dapat mengambil hal itu di rute Anda yang lain dengan mendapatkan parameter yang dikirim menggunakan
req.query
.Untuk cara yang lebih dinamis, Anda dapat menggunakan
url
modul inti untuk menghasilkan string kueri untuk Anda:Jadi, jika Anda ingin mengarahkan semua variabel string permintaan req, Anda bisa melakukannya
Dan jika Anda menggunakan Node> = 7.x Anda juga dapat menggunakan
querystring
modul intiCara lain untuk melakukannya adalah dengan mengatur sesuatu di sesi. Anda dapat membaca cara mengaturnya di sini , tetapi untuk mengatur dan mengakses variabel adalah seperti ini:
Dan kemudian setelah pengalihan ...
Ada juga opsi menggunakan fitur Express yang lama,
req.flash
,. Jika melakukannya dalam versi Express yang lebih baru, Anda harus menggunakan pustaka lain. Pada dasarnya itu memungkinkan Anda untuk mengatur variabel yang akan muncul dan mengatur ulang saat Anda pergi ke halaman berikutnya. Berguna untuk menunjukkan kesalahan kepada pengguna, tetapi sekali lagi itu dihapus secara default. EDIT: Menemukan perpustakaan yang menambahkan fungsi ini.Mudah-mudahan itu akan memberi Anda gambaran umum bagaimana menyampaikan informasi di dalam aplikasi Express.
sumber
/
rute utama . Pilihan lain adalah memanggil rute posting melalui AJAX dan menyimpan data yang dihasilkan di penyimpanan lokal atau yang serupa.Cara termudah yang saya temukan untuk meneruskan data antara routeHandlers untuk digunakan
next()
tidak perlu dipusingkan dengan pengalihan atau sesi. Secara opsional, Anda hanya dapat memanggil panggilanhomeCtrl(req,res)
alih-alihnext()
dan hanya meneruskanreq
danres
sumber
/
Saya harus menemukan solusi lain karena tidak ada solusi yang disediakan yang benar-benar memenuhi persyaratan saya, karena alasan berikut:
String kueri : Anda mungkin tidak ingin menggunakan string kueri karena URL dapat dibagikan oleh pengguna Anda, dan terkadang parameter kueri tidak masuk akal untuk pengguna yang berbeda. Misalnya, kesalahan seperti
?error=sessionExpired
seharusnya tidak pernah ditampilkan ke pengguna lain secara tidak sengaja.req.session : Anda mungkin tidak ingin menggunakan
req.session
karena Anda memerlukan dependensi sesi ekspres untuk ini, yang meliputi menyiapkan toko sesi (seperti MongoDB), yang mungkin tidak Anda perlukan sama sekali, atau mungkin Anda sudah menggunakan kustom solusi sesi toko.next () : Anda mungkin tidak ingin menggunakan
next()
ataunext("router")
karena ini pada dasarnya hanya membuat halaman baru Anda di bawah URL asli, itu sebenarnya bukan pengalihan ke URL baru, lebih seperti pengalihan / penulisan ulang, yang mungkin tidak dapat diterima.Jadi ini solusi keempat saya yang tidak mengalami masalah sebelumnya. Pada dasarnya ini melibatkan penggunaan cookie sementara, di mana Anda harus menginstal cookie-parser terlebih dahulu . Jelas ini berarti ini hanya akan berfungsi jika cookie diaktifkan, dan dengan jumlah data yang terbatas.
Contoh implementasi:
sumber
express-session
. Database hanya membuat sesi tetap di seluruh server restart.gunakan app.set & app.get
Pengaturan data
Mendapatkan data
sumber
Inilah yang saya sarankan tanpa menggunakan dependensi lain, cukup simpul dan ekspres, gunakan app.locals, ini contohnya:
sumber
Anda bisa melewatkan bit kecil dari data pasangan kunci / nilai melalui string kueri:
Dan javascript pada halaman beranda dapat mengaksesnya dan menyesuaikan perilakunya sesuai.
Perhatikan bahwa jika Anda tidak keberatan
/category
tetap sebagai URL di bilah alamat peramban, Anda bisa langsung merendernya alih-alih mengarahkan. IMHO berkali-kali orang menggunakan arahan ulang karena kerangka kerja web lama dibuat langsung merespons sulit, tetapi mudah diungkapkan:Sebagai @ Dropped.on.Caprica berkomentar, menggunakan AJAX menghilangkan kekhawatiran mengubah URL.
sumber
kita bisa menggunakan sesi ekspres untuk mengirim data yang diperlukan
ketika Anda menginisialisasi aplikasi
jadi sebelum pengalihan hanya menyimpan konteks untuk sesi ini
Sekarang Anda bisa mendapatkan konteks di mana saja untuk sesi ini. itu bisa hanya dengan req.session.context
sumber