Melewati variabel ke middleware berikutnya menggunakan next () di Express.js

200

Nah, pertanyaan saya adalah saya ingin melewatkan beberapa variabel dari middleware pertama ke middleware lain, dan saya mencoba melakukan ini, tetapi ada " req.somevariablediberikan sebagai 'tidak terdefinisi'".


//app.js
..
app.get('/someurl/', middleware1, middleware2)
...

////middleware1
...
some conditions
...
res.somevariable = variable1;
next();
...

////middleware2
...
some conditions
...
variable = req.somevariable;
...
pengguna2791897
sumber
Harus bekerja Kecuali itu salah ketik dalam pertanyaan Anda mungkin gagal karena Anda menetapkan nilainya resdi middleware1 dan mencoba untuk mendapatkannya dari reqdi middleware2.
Andreas Hultgren
Thankz @AndreasHultgren
user2791897
Local variables are available in middleware via req.app.locals expressjs.com/pt-br/api.html#app.locals
Ronnie Royston

Jawaban:

202

Lampirkan variabel Anda ke reqobjek, bukanres .

Dari pada

res.somevariable = variable1;

Memiliki:

req.somevariable = variable1;

Seperti yang telah ditunjukkan orang lain, res.localsadalah cara yang disarankan untuk mengirimkan data melalui middleware.

Amberlamps
sumber
13
gunakan res.locals.variable = var; lihat jawaban lain
godzsa
1
untuk mengambil variabel, gunakan req.res.locals.variable di fungsi middleware berikutnya
William Wu
3
@ WilliamWu res.locals, bukan req.res.locals.
cchamberlain
2
res.locals.myVaradalah cara untuk pergi.
jasoneminara
448

Inilah tujuan objek res.locals . Pengaturan variabel langsung pada objek permintaan tidak didukung atau didokumentasikan. res.locals dijamin memiliki status selama masa permintaan.

res.locals

Objek yang berisi variabel lokal respons yang mencakup permintaan, dan karena itu hanya tersedia untuk tampilan yang diberikan selama siklus permintaan / respons tersebut (jika ada). Jika tidak, properti ini identik dengan app.locals.

Properti ini berguna untuk mengekspos informasi tingkat permintaan seperti nama jalur permintaan, pengguna yang diautentikasi, pengaturan pengguna, dan sebagainya.

app.use(function(req, res, next) {
    res.locals.user = req.user;  
    res.locals.authenticated = !req.user.anonymous;
    next();
});

Untuk mengambil variabel di middleware berikutnya:

app.use(function(req, res, next) {
    if (res.locals.authenticated) {
        console.log(res.locals.user.id);
    }
    next();
});
cchamberlain
sumber
67
Tidak tahu mengapa ini bukan jawaban yang diterima, ini adalah yang didokumentasikan cara untuk mengatur variabel dari middleware seluruh permintaan.
Sam Holmes
11
res.locals dimaksudkan untuk digunakan oleh pandangan yang akhirnya diberikan selama siklus permintaan, inilah yang dikatakan oleh dokumentasi. Jika Anda tidak menggunakan tampilan, itu berlebihan untuk meletakkan sesuatu pada objek lokal dan bukan konvensi. Dalam kasus ini, saya cenderung mendorong orang untuk tetap dengan konvensi sehingga kita dapat mengurangi beban kognitif sambil mempelajari konsep-konsep seperti Express atau meminta siklus hidup.
real_ate
2
@real_ate itu adalah penggunaan utama res.locals, namun itu tidak menjawab pertanyaan OP. Melewati variabel cakupan permintaan ke middleware masa depan kadang-kadang merupakan keharusan, saat saya mendapatkannya biasanya sekitar otentikasi pengguna di middleware awal yang menetapkan klaim yang dialihkan ke middleware hilir.
cchamberlain
14
Dokumentasi cepat untuk menulis middleware menetapkan variabel pada reqobjek expressjs.com/en/guide/writing-middleware.html . Lihatlah bagianMiddleware function requestTime
Lele
3
@memberikan itu untungnya bukan bagaimana respons bekerja. Respons dikirimkan dengan memanggil properti fungsional objek respons seperti res.json({}), dll. res.localsHanya tersedia di back-end selama umur permintaan. expressjs.com/en/5x/api.html
cchamberlain
22

Saya tidak berpikir bahwa praktik terbaik akan melewati variabel suka req.YOUR_VAR. Anda mungkin ingin mempertimbangkan req.YOUR_APP_NAME.YOUR_VARatau req.mw_params.YOUR_VAR.

Ini akan membantu Anda menghindari menimpa atribut lainnya.

Pembaruan 31 Mei 2020

res.locals adalah apa yang Anda cari, objek dicakup untuk permintaan tersebut.

Objek yang berisi variabel lokal respons yang mencakup permintaan, dan karena itu hanya tersedia untuk tampilan yang diberikan selama siklus permintaan / respons tersebut (jika ada). Jika tidak, properti ini identik dengan app.locals.

Properti ini berguna untuk mengekspos informasi tingkat permintaan seperti nama jalur permintaan, pengguna yang diautentikasi, pengaturan pengguna, dan sebagainya.

Doron Segal
sumber
2
Bagaimana Anda menyarankan untuk mengatur req.YOUR_APP_NAME = {}awalnya? Anda hanya mencoba menulis kepada req.YOUR_APP_NAME.someVarAnda akan mendapatkan kesalahan karena req.YOUR_APP_NAMEbelum didefinisikan.
Kousha
2
@ Kousha Anda dapat menulis router middleware di bagian atas skrip perutean Anda:router.use(function(req,res,next){req.YOUR_APP_NAME = {};next()})
Tomas
apakah ada cara untuk meneruskannya sebagai param dengan fungsi () berikutnya? seperti next (myObj)
philx_x
1
@ Kousha - Kesalahan Anda yang tidak terdefinisi tidak ada hubungannya dengan express, Anda mencoba untuk menetapkan properti ke objek yang tidak ada. Biasanya untuk melakukan ini, Anda akan menggunakan req.APP_NS = req.APP_NS || {}; req.APP_NS.somevar = 'value'.
cchamberlain
1
@ philx_x, jika Anda melewatkan parameter apa pun untuk nextberfungsi, itu akan memicu penangan kesalahan express dan drop out. periksa dokumen.
Merl
7

Itu karena reqdan resdua benda yang berbeda.

Anda perlu mencari properti pada objek yang sama dengan yang Anda tambahkan.

Slaks
sumber
3

Caranya cukup sederhana ... Siklus permintaan masih cukup hidup. Anda bisa menambahkan variabel baru yang akan membuat panggilan sementara

app.get('some/url/endpoint', middleware1, middleware2);

Karena Anda dapat menangani permintaan Anda di middleware pertama

(req, res, next) => {
    var yourvalue = anyvalue
}

Di middleware 1 Anda menangani logika Anda dan menyimpan nilai Anda seperti di bawah ini:

req.anyvariable = yourvalue

Di middleware 2 Anda dapat menangkap nilai ini dari middleware 1 dengan melakukan hal berikut:

(req, res, next) => {
    var storedvalue = req.yourvalue
}
Delino
sumber
1

Seperti disebutkan di atas, res.locals adalah cara yang baik (disarankan) untuk melakukan ini. Lihat di sini untuk tutorial singkat tentang cara melakukannya di Express.

nax3t
sumber