2017-09-05 2 views
1

Ich arbeite mit Nodejs und EJS-Vorlage. Ich möchte eine Middleware einstellen, die nur beim Laden der Seite aufgerufen wird, nicht wenn ich eine Anfrage aus dem Code sende.Nodejs: Middleware nur zum Laden der Seite

Beispiel:

app.use(function(req, res, next){ 
    if(req.session){ 
     console.log("OKAY"); 
    } 
    next(); 
}); 

Ich möchte dieses Protokoll nur auf das Laden der Seite angezeigt wird, nicht, wenn ich Anfrage von Code wie unten

$.get("/users", function(data) { 
    console.log(data); 
}); 

Wie kann ich das tun?

Danke

Antwort

3

Sie haben ein paar Optionen:

  1. In Middleware können Sie req.path überprüfen, um zu sehen, ob es ein Weg ist, dass Sie die Middleware oder nicht gelten sollte und verwenden Sie ein if in Ihrer Middleware, entweder nur next() anrufen, ohne etwas zu tun oder zu tun, was auch immer die Middleware entwickelt wird.

  2. Sie können Ihre Routen zu dieser Seite Routen und AJAX-Routen auf separaten Pfaden entwerfen und dann einen Router für Seitenrouten und einen Router für AJAX-Routen und legen Sie die Middleware nur auf den Seitenrouter.

Es wird Ihnen wirklich helfen, eine Menge (entweder mit Option oben), wenn Sie Ihre URLs entwerfen, so dass es einfach für Ihren Server zu unterscheiden, ob dies eine URL, die nicht die Middleware angewandt haben sollte oder. In der Regel besteht die einfachste Möglichkeit darin, ein bekanntes Präfix für einen oder beide Zweige Ihres URL-Designs zu verwenden. Zum Beispiel können alle Ajax-URLs mit /api beginnen und dann können Sie alle API-Aufrufe ganz einfach an einen speziellen Router umleiten und alle anderen URLs sind Nicht-API-URLs (wahrscheinlich Seiten-URLs).

Hier ist ein Beispiel des separaten API-Router:

// split off all API calls to a separate router 
let apiRouter = express.Router(); 
app.use('/api', apiRouter); 

// handle /api/users 
apiRouter.get('/users', handleUserAjaxRequest); 

// handle all other /api/xxx routes that don't have their own handler 
apiRouter.use(function(req, res, next) { 
    // if /api request not handled by here, then don't allow it to propagate further 
    // it must be a invalid /api/xxx URL, so do a 404 
    res.status(404).end(); 
}); 

// this won't get called if there's a /api/xxx URL because that will have 
// already been handled by the apiRouter 
app.use(someMiddleware); 

app.get('/somepage', handleSomePageURL); 

Sie auch einen separaten Router für alle Seitenanforderungen, die Modularität ein wenig sauberer mit allen API Routen in einem Modul und alle machen könnte nutzen könnten Seitenrouten in einem anderen Modul, wobei jeder seinen eigenen Router exportiert.

+0

Danke. Ich habe req.xhr von deinem Link gesehen und es ist besser für mein kleines nodejs Projekt. Aber natürlich werde ich meine zukünftigen großen nodejs Projekte verwalten, wie Sie in der zweiten Option erklären;) –

0

ich JQuery bin mit Anfrage von Client zu senden, und ich sah Link von jfriend00 ist, dass req.xhr eine Boolesche Eigenschaft gibt, die wahr ist, wenn die X-Requested-With-Header-Feld der Anforderung ist „XMLHttpRequest“, was darauf hinweist, dass die Anforderung ausgegeben wurde von einer Client-Bibliothek wie jQuery.

app.use(function(req, res, next){ 
    if(req.xhr){ 
     console.log("FROM CLIENT LIBRARY"); 
    } 
    next(); 
}); 

Danke jfriend00

+1

Ich denke wirklich, es ist besser, nur Ihre URLs so zu entwerfen, dass API URLs von Seiten URLs in einer leicht zu unterscheidenden Weise getrennt sind. Das ist viel mehr erweiterbar und steuert die Dinge nach der tatsächlichen Funktion und nicht nach einem Flag, das ein Client setzen könnte oder auch nicht. – jfriend00

+0

Ja, du hast Recht. Die Middleware wird beim Laden der Seite oft aufgerufen, und es ist nicht gut, weil ich oft danach frage. Vielen Dank –

Verwandte Themen