Lingkungan: Node.js, Express

Pertanyaan: Dalam Ekspres apakah praktik terbaik menggunakan req.session untuk mentransfer data antar rute?

Latar Belakang: Saya menggunakan req.session untuk mentransfer data klien antar rute dan tampaknya berfungsi dengan baik. Namun saya tidak bekerja dalam tim dan saya tidak memiliki siapa pun untuk diperiksa untuk melihat apakah ini cara cerdas untuk mentransfer data antar rute.

Contoh: Di bawah ini adalah server ekspres yang terlalu disederhanakan yang merupakan tiruan yang terhubung ke server luwak. Dalam rute / default, example@example.com login. Dalam rute edit_user_data, namanya diubah. Pola dasar pengiriman data pengguna ke rute menggunakan req.session ini berfungsi tetapi saya tidak yakin apakah ini cara yang baik untuk mendekati masalah ini.

const express = require('express');
const session = require('express-session');
const app = express();

app.use(session({
    name: process.env.SESSION_NAME,
    resave: false,
    saveUninitialized: false,
    secret: process.env.SESSION_SECRET,
    cookie: {
        sameSite: true,
        secure: false,
    } 
}));

app.get('/', async function(req, res, next) {

    let emailAddress = example@example.com;
    let userData = await User.findOne({ email: emailAddress });

    req.session.userData = userData;

    res.render('home_page', { userData });
});

app.get('/edit_user_data', async function(req, res, next) {

    let editName = 'Roger';
    await User.updateOne({ email: userData.email }, { name: editName });

    res.render('/edit_user_data');
});

app.listen(8080);
-1
myNewAccount 27 Februari 2020, 23:54

1 menjawab

Jawaban Terbaik

Di Express, apakah praktik terbaik menggunakan req.session untuk mentransfer data antar rute?

Tidak terlalu.

Objek sesi adalah untuk menyimpan status bagi pengguna yang mungkin perlu diakses secara teratur di banyak rute seperti nama mereka, status login mereka, dll... Biasanya tidak digunakan untuk status sementara yang dikirim dari satu rute ke rute berikutnya.

Jika Anda mencoba menyetel pengganda dalam satu rute dan kemudian menggunakan pengganda itu di rute lain, itu semacam melanggar model REST untuk halaman yang menggambarkan diri sendiri yang tidak bergantung pada beberapa urutan kejadian ajaib yang terjadi sebelum URL ini memukul. Misalnya, jika pengguna menandai rute /multiplier Anda, mereka mungkin mendapatkan hasil yang berbeda setiap kali mereka pergi ke sana. Ini bukan benar-benar bagaimana sesi harus digunakan. Itu dapat digunakan seperti itu, tetapi untuk contoh yang Anda tunjukkan, kecuali nilai pengganda lebih seperti preferensi pengguna yang dimaksudkan untuk diterapkan ke banyak halaman dan bertahan untuk waktu yang lama (yang sebenarnya tidak, karena Anda menggunakannya lalu menghapusnya), maka tidak masuk akal untuk memasukkan ini ke dalam sesi. Itu merusak kemampuan REST dari URL /multiplier karena membuat sesuatu yang berbeda atau kesalahan tergantung pada apa yang terjadi sebelumnya. Itu bukan konsep REST.

Konsep REST adalah menempatkan pengganda dalam parameter kueri untuk URL:

/multiplier?value=10;

Kemudian, siapa pun yang merender halaman bisa mendapatkan nilai itu dari parameter kueri dan URL menggambarkan dirinya sendiri, berdiri sendiri, berfungsi untuk bookmark, berfungsi dengan baik bahkan jika ada banyak jendela yang terbuka, tidak memiliki kondisi balapan dan konsisten dengan Filosofi desain REST.

app.get('/multiplier', function(req, res, next) {
    let clientData = +(req.query.value || 1);
    let output = clientData * 100;
    res.send(output);
});

Dalam contoh baru yang Anda tambahkan ke pertanyaan Anda, pertama-tama Anda melakukan:

GET /

Dan, itu entah bagaimana memasukkan beberapa status ke dalam sesi yang kemudian memengaruhi hasil:

GET /edit_user_data

Itu tidak masuk akal bagiku. Dalam arsitektur REST, GET harus idempoten. Itu berarti bahwa URL yang diberikan untuk GET yang diberikan harus menghasilkan hasil yang sama setiap saat. GET /edit_user_data Anda tidak seperti itu. Apa yang dilakukannya tampaknya tergantung pada sesuatu yang datang sebelumnya sehingga URL tertentu dapat memiliki efek yang berbeda setiap kali. Itu BUKAN idempoten.

Anda akan menggunakan POST untuk menyisipkan catatan baru dalam database atau PUT untuk mengubah catatan yang ada dalam database dan Anda akan mengirim data dengan permintaan, tidak sebelumnya ditunggangi di suatu tempat ke keadaan tertentu.

Apa yang Anda coba lakukan bukanlah arsitektur REST. Ada banyak tutorial atau deskripsi bagus tentang arsitektur REST. Saya sarankan Anda membaca beberapa di antaranya. Berikut salah satu artikel tersebut.

2
jfriend00 28 Februari 2020, 01:37