2017-02-23 5 views
1

Ich verwende Knoten und Express für das Back-End einer iOS-Anwendung. Daten werden in einer SQL Server-Datenbank gespeichert, sodass iOS-Apps den Server abfragen, der Server die Datenbank abfragt, der Server die DB-Antwort erhält und die Antwort dann an die iOS-Anwendung weiterleitet. Ich versuche herauszufinden, wie Caching funktioniert. Ich biete viele statische Inhalte an - Blogartikel zum Beispiel. Also habe ich geplant, Etags zu benutzen, aber ich bin mir nicht sicher, wie es funktionieren soll. Ich mache eine Anfrage, bekomme Inhalt und cache die Antwort auf der Client-Seite. OK. Dann mache ich dieselbe Anfrage später mit dem Etag der vorherigen Antwort, die in der 'If-None-Match'-Kopfzeile gespeichert ist. Dann was?Wie gebe ich 304 Unmodified Status mit Express.js zurück?

Handelt Express.js das automatisch? Es scheint nicht - ich konnte es nicht bekommen, um eine 304 Antwort zu erzeugen. Wenn ich versuche, die Antwortheader zu überprüfen, bevor ich die Antwort sende, bekomme ich null, daher kann ich die Etag einer Antwort nicht bekommen, bevor ich sie sende. Also wie soll ich das Anfrage-Etag mit dem Etag des Inhalts vergleichen, den der Server zurücksenden würde? Soll ich benutzerdefinierte generierte Etags verwenden und diese auf dem Server zwischenspeichern, um dann Anforderungs-Etags mit diesem Cache zu vergleichen?

Unten ist eine sehr einfache Route, die ich eingerichtet habe, um dies zu testen, keine Datenbank beteiligt. Ich sende nur eine Nummer an den Server, und es gibt das Quadrat zurück. Wenn ich eine Anfrage mit einem Etag an dieselbe URL sende, bekomme ich dieselbe Antwort. Ich kann den 'If-None-Match'-Header der Anfrage überprüfen, aber was soll ich vergleichen, um festzustellen, ob ich einen 304 anstelle eines 200 Status senden soll?

router.use("/square/:testId", function(req, res) { 

    var obj = {}; 
    obj["testId"] = req.params.testId; 
    obj["result"] = req.params.testId * req.params.testId; 

    res.setHeader('Cache-Control', 'public, max-age=5'); 

    var h2 = JSON.stringify(res.headers,null,2); 
    console.log("The response headers: " + h2); 
    //Prints null 

    res.status(200).send(obj); 
}); 

Antwort

1

soll ich benutzerdefinierte erzeugt etags verwenden und diese auf dem Server zwischengespeichert werden, dann Anfrage vergleichen mit diesem Cache ETags?

Ja, können Sie so etwas wie das etag npm Modul verwenden, das Sie einen Buffer oder String und liefert mit einem starken etag Wert annehmen kann: res.setHeader('ETag', etag(body)). Wenn Sie Änderungsdaten in Ihrer Datenbank speichern, können Sie diese auch einfach in Form eines Headers an den Client senden. In diesem Fall würde der Client am Ende eine If-Modified-Since in nachfolgenden Anfragen senden, die Sie dann verwenden könnten, um mit der Änderungsspalte der angeforderten Ressource zu vergleichen.

In beiden Fällen müssen Sie mit dem entsprechenden Statuscode, den Kopfzeilen und dem Textkörper antworten.

Wenn Sie statische Dateien aus dem tatsächlichen Dateisystem dienen, dann könnten Sie einfach die Express-Middleware verwenden, die automatisch das richtige Caching-Verhalten bietet.

0

Es ist nicht erforderlich, ein Drittanbietermodul wie etag zu verwenden. Express handhabt die Logik hinter etag und braucht keinen Code zu schreiben.

  1. Aktivieren Sie etag in Express. Im folgenden Beispiel verwenden wir starke Etags.

    // Use string ETag 
    app.set('etag', 'strong'); 
    
  2. Erstellen Sie Ihre Antwort in der GET Methode:

    app.get('/my-data', (req, res) => { 
        ... 
        res.append('Last-Modified', (new Date(lastModifiedStringDate)).toUTCString()); 
        return res.send(response); 
    } 
    

Voilá, Express entweder den Inhalt Ihrer Antwort 200 OK oder einen leeren Körper mit Antwort 304 Not Modified senden.

Clients, die Anfragen mit Header If-None-Match senden, erhalten HTTP 304 Not Modified, wenn sich die etag nicht geändert hat.

Stellen Sie sicher, dass Ihre Anforderungen nicht senden Cache-Control: no-cache. Tools wie Postman per default senden Sie die Kopfzeile Cache-Control: no-cache, die die Express ETag ungültig macht (kein Cache ist schließlich kein Cache). Sie können dieses Verhalten ändern, indem Sie es in Postman-Einstellungen umschalten.

Wir fügen die als ein Plus in unserer Antwort hinzu. Sie müssen es nicht wie wir verwenden. Aber Express wird auch den Header If-Modified-Since: mit ähnlicher Logik (zeitlich) statt Inhalt (Etags) zu respektieren.

Verwandte Themen