2013-07-17 14 views
8

node.js'de, Express for framework ve Winston, şu an için logger modülü olarak RESTful bir sunucu geliştiriyorum. Bu sunucu, büyük miktarda eşzamanlı isteği işleyecektir ve her istek için 'istek kimliği' gibi bir şey kullanarak günlük girişlerini takip edebilmem için çok yararlı olacaktır. Düz çözüm, her defasında bir günlük girişi yapmak istediğimde bu kimliği başka bir kayıt bilgisi olarak eklemektir, ancak sunucu tarafından kullanılan her bir yönteme 'istek kimliği' iletilmesi anlamına gelecektir.Express'te middleware zinciri aracılığıyla istek (ID ile) nasıl belirlenir.

ben her özel isteği için istek kimliği etrafında taşıyan olmadan herhangi node.js/me daha kolay bir şekilde bunu yapmak için izin verecek JavaScript modül veya teknik olup olmadığını bilmek istiyorum

. Beni anlayan req nesneyi kullanabilirsiniz

cevap

4

express her isteği ile geliyor.
Dolayısıyla bunu uygulaması yapacağını ilk güzergah olacaktır:

var logIdIterator = 0; 

app.all('*', function(req, res, next) { 
    req.log = { 
    id: ++logIdIterator 
    } 
    return next(); 
}); 

Ve sonra her yerde ekspres içinde, o idreq nesne erişebilir: req.log.id;
Bazı verileri, bazı günlükler oluşturmak isteyen işlevlere aktarmanız gerekecektir. Aslında, req.log nesnesinde günlüğe kaydetme işlevine sahip olabilirsiniz, bu nedenle, günlüğe kaydetmenin yalnızca req.log nesnesine erişim olduğunda olacağı garanti edilecektir.

+1

Cevabınız için teşekkür ederiz. Ayrıca teklif ettiğin çözümü kullanmam da gerekiyor. Ancak, uygulanacak kimliği otomatik olarak tanımlamak için aklımdaydım. Uyguladığım bir çözüm, kimliği istek nesnesinde saklamaktı ve özel günlük işlevimi çağırırken, bu çağrı kimliğinde kimliği bulmadı. Bunun birçok nedenden dolayı yanlış olduğunu biliyorum (diğer işlevlerin parametre bilgisine erişmek "katı modda" yasak, verimli değil ve bir G/Ç etkinliği başlatıldığında yeni bir yığın elde etmek). Sanırım bu sadece mümkün değil ve önerdiğiniz çözüm en uygun olana benziyor. –

16

Otomatik olarak artırırsanız, daha sonraki günlük analizleriniz istekleri benzersiz şekilde tanımlayamaz, çünkü farklı örnekler çarpışan kimlikler oluşturacak ve uygulama yeniden başlatıldığında otomatik olarak kimlik çarpışmalarına neden olacaktır.

İşte bir başka olası çözüm.

yükleyin cuid:

npm install --save cuid 

Sonra ana uygulama dosyasında:

var cuid = require('cuid'); 
var requestId = function requestId(req, res, next) { 
    req.requestId = cuid(); 
    next(); 
}; 

// Then, at the top of your middleware: 
app.use(requestId); 

Şimdi çarpışmak olası değildir samimi istek kimliği alırsınız ve size mümkün olacak Birden çok örnekte bile olsa günlük analizleriniz ve hata ayıklama taleplerinizi ve sunucu yeniden başlatmayı benzersiz şekilde tanımlar.

+1

Evet, bu kesinlikle daha iyi bir çözümdür, ancak bununla ilgili sorun, winston günlüklerindeki kimliği göstermenizdir, böylece çok fazla veri çoğaltması yapmazsınız. –

+0

Ayrıca, etki alanlarını (veya alan adlarını değiştirmeye karar verdiklerinde) kullanırız, böylece kodunuzun katmanları boyunca istek bilgilerini aşağıya aktararak işlev çağrılarını kirletmezsiniz. – CBP

+0

Alanlar kullanımdan kaldırıldı ve yerine geçecek somut planlar mevcut değil. –

0

Genel Değişkenleri kullanmamalısınız.

Yapmayı sevdiğim, her istek öncesinde bir META nesnesini doldurmaktır.

Ben bir istek

İşte bu sorun için bir çözüm arayışını çabaladığını bir örnek

app.all('*', function(req, res, next) { 
    req.meta = { 
     ip: req.headers['x-forwarded-for'] || req.connection.remoteAddress, 
     timestamp: uuid(), 
     user_agent: req.headers['user-agent'], 
     body: req.body, 
    } 
    return next(); 
    }) 
2

var kimliğine bir UUID jeneratör (https://github.com/kelektiv/node-uuid) kullanın. Burada önerilen çözümlerden hoşlanmadığım şey, req nesnesini proje boyunca tüm işlevler arasında paylaşmayı ima etmeleriydi. Yaklaşımınızı karıştırarak (istek başına bir uuid yaratıyor) ve modülleri arasında ad alanlarının paylaşılmasına izin veren bir kitaplık (devam-yerel depolama) ile bir çözüm buldum.

Bu diğer yanıtında açıklama bulabilirsiniz

: tek bir yerde her şeyi açıklamak amacıyla, daha fazla bilgi isterlerse https://stackoverflow.com/a/47261545/5710581

, bir yazı tüm bu fikir ve tüm kodu yazdım: Express.js: Logging info with global unique request ID – Node.js

İlgili konular