Express.js'de next () kullanarak değişkenleri sonraki ara katman yazılımına geçirme


201

Benim sorum şu, ilk ara yazılımdan başka bir ara katman yazılımına bazı değişkenler aktarmak istiyorum ve bunu yapmaya çalıştım, ama req.somevariable"tanımsız olarak verildi" vardı.


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

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

////middleware2
...
some conditions
...
variable = req.somevariable;
...

Çalışmalı. Bu sorudaki bir yazım hatası olmadığı sürece, büyük olasılıkla başarısız olursunuz çünkü değeri resmiddleware1'e atarsınız ve middleware2'den almaya çalışırsınız req.
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

Yanıtlar:


203

Değişkeninizi reqnesneye ekleyin , değil res.

Onun yerine

res.somevariable = variable1;

Sahip olmak:

req.somevariable = variable1;

Diğerlerinin de belirttiği gibi, res.localsveriyi ara katman yazılımından geçirmenin önerilen yoludur.


14
res.locals.variable = var kullanın; diğer cevabı gör
godzsa

1
Bir sonraki katman fonksiyonunda değişkeni, kullanım req.res.locals.variable almak için
William Wu

3
@WilliamWu onun res.localsdeğil req.res.locals.
18:56, cchamberlain

2
res.locals.myVargitmek için bir yoldur.
jasonseminara

451

Bu nedir res.locals nesne içindir. Değişkenleri doğrudan istek nesnesi üzerinde ayarlamak desteklenmez veya belgelenmez. res.locals , bir isteğin ömrü boyunca durumunu koruyacaktır .

res.locals

Yanıt yerel değişkenlerini içeren ve isteğe bağlı kapsamda olan ve bu nedenle yalnızca bu istek / yanıt döngüsü sırasında (varsa) görüntülenen görünüm (ler) için kullanılabilen bir nesne. Aksi takdirde, bu özellik app.locals ile aynıdır.

Bu özellik, istek yolu adı, kimliği doğrulanmış kullanıcı, kullanıcı ayarları vb. Gibi istek düzeyinde bilgileri göstermek için kullanışlıdır.

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

Bir sonraki ara katman yazılımında değişkeni almak için:

app.use(function(req, res, next) {
    if (res.locals.authenticated) {
        console.log(res.locals.user.id);
    }
    next();
});

68
Bu kabul cevap değil neden bilmiyorum, bu belgelenmiş bir istek boyunca katman kümesini değişkenlere yol.
Sam Holmes

13
res.locals, sonunda talebin yaşam döngüsü sırasında oluşturulan görünümler tarafından kullanılmak üzere tasarlanmıştır , bu belgelerin söylediği şeydir. Görünümleri kullanmıyorsanız, yerel nesneye bir şeyler koymak aşırıya kaçar ve bu kural değildir . Bu durumlarda, Express gibi kavramları öğrenirken ya da yaşam döngüsü talep ederken bilişsel yükü azaltabilmemiz için insanları sözleşmeye uymaya teşvik ediyorum.
real_ate

2
@real_ate, res.locals'ın birincil kullanımıdır, ancak OPs sorusunu ele almaz. Gelecekteki ara katman yazılımına istek kapsamındaki değişkenleri iletmek bazen bir zorunluluktur, bu zamana kadar kullandığım zamanlar genellikle bir alt ara katman yazılımına yönlendirilen iddiaları belirleyen erken bir ara katman yazılımında kullanıcı kimlik doğrulaması etrafındadır.
cchamberlain

14
Ara katman yazılımı yazmak için açık belgeler, expressjs.com/en/guide/writing-middleware.htmlreq nesnesinde değişkenler ayarlar . Bölümlere bakınMiddleware function requestTime
Catfish

3
@goonerify Neyse ki yanıtın nasıl çalıştığını değil. Yanıtlar res.json({}), vb. Gibi yanıt nesnesinin işlevsel bir özelliği çağrılarak iletilir . res.localsYalnızca isteğin ömrü boyunca arka uçta kullanılabilir. expressjs.com/en/5x/api.html
cchamberlain

23

En iyi uygulamanın böyle bir değişkeni geçeceğini düşünmüyorum req.YOUR_VAR. Düşünmek isteyebilirsiniz req.YOUR_APP_NAME.YOUR_VARveya req.mw_params.YOUR_VAR.

Diğer özelliklerin üzerine yazmaktan kaçınmanıza yardımcı olacaktır.

Güncelleme 31 Mayıs 2020

res.locals aradığınız şeydir, nesne isteğe kapsamlıdır.

Yanıt yerel değişkenlerini içeren ve isteğe bağlı kapsamda olan ve bu nedenle yalnızca bu istek / yanıt döngüsü sırasında (varsa) görüntülenen görünüm (ler) için kullanılabilen bir nesne. Aksi takdirde, bu özellik app.locals ile aynıdır.

Bu özellik, istek yolu adı, kimliği doğrulanmış kullanıcı, kullanıcı ayarları vb. Gibi istek düzeyinde bilgileri göstermek için kullanışlıdır.


2
req.YOUR_APP_NAME = {}Başlangıçta nasıl ayarlamayı önerirsiniz ? Sadece yazmaya çalışmayı denerseniz henüz tanımlanmayan req.YOUR_APP_NAME.someVarbir hata alırsınız req.YOUR_APP_NAME.
Kousha

2
@Kousha Yönlendirme komut dosyanızın üst kısmına yönlendirici ara katman yazılımı yazabilirsiniz:router.use(function(req,res,next){req.YOUR_APP_NAME = {};next()})
Tomas

next () işleviyle param olarak iletmenin bir yolu var mı? next like (myObj)
philx_x

1
@Kousha - Tanımsız hatanızın express ile ilgisi yok, var olmayan bir nesneye bir özellik atamaya çalışıyorsunuz. Genellikle bunu yapmak için kullanırsınız req.APP_NS = req.APP_NS || {}; req.APP_NS.somevar = 'value'.
cchamberlain

1
@ philx_x, nextişlev için herhangi bir parametre iletirseniz, express 'hata işleyicisini tetikler ve devre dışı bırakır . belgeleri kontrol edin.
Merl

7

Çünkü reqve resiki farklı nesnedir.

Özelliği, eklediğiniz aynı nesnede aramanız gerekir.


3

Hile oldukça basit ... İstek döngüsü hala çok canlı. Sadece geçici bir çağrı oluşturacak yeni bir değişken ekleyebilirsiniz.

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

İlk ara yazılımda isteğinizi yerine getirebileceğiniz için

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

Ara katman yazılımında mantığınızı ele alırsınız ve değerinizi aşağıdaki gibi saklarsınız:

req.anyvariable = yourvalue

Ara katman yazılımı 2'de bu değeri ara katman yazılımı 1'den aşağıdakileri yaparak yakalayabilirsiniz:

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

1

Yukarıda belirtildiği gibi, res.locals bunu yapmanın iyi (önerilen) bir yoludur. Express'te bunun nasıl yapılacağı hakkında hızlı bir eğitim için buraya bakın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.