web-dev-qa-db-fra.com

comment fonctionne un etag dans expressjs

Expressjs envoie automatiquement des étiquettes. Je voudrais savoir comment l'etag est généré ... est-il basé sur le contenu généré dynamiquement par la routine get. ou y a-t-il moyen de le gérer, en ne passant même pas par le processus de génération du contenu (contenu dynamique - à partir de la base de données) et de renvoyer etag de la même manière.

peut être un middleware qui commence par vérifier simplement s'il s'agit d'un identifiant de session valide et retransmet le même etag que le client donne ou peut être basé sur l'url + identifiant de session .. de cette façon, il sera unique. et mettre fin à la demande plutôt en passant par tout l'appel db et toutes ces choses. dans ce cas, j'aurais besoin de savoir que le client effectue un appel 304.

Je pourrais y aller avec la balise expires, mais lorsque la session sera terminée. si quelqu'un ouvre l'URL, cela ne devrait pas être autorisé. donc je pense que l'etag devrait également être basé sur l'identifiant de session. comment fonctionne-t-il s'il est modifié dans ce scénario de contenu dynamique? peut-il être utilisé.

39
coool

Au moment de la rédaction (8 juillet 2014), des ETags faibles sont générés en utilisant CRC32 ( source ) et des ETags forts sont générés en utilisant MD5 ( source ).

D'après ce que dit l'un des contributeurs d'Express , vous pouvez spécifier s'il faut utiliser les ETags forts ou faibles en:

app.enable('etag') // use strong etags
app.set('etag', 'strong') // same
app.set('etag', 'weak') // weak etags

Il semble que vous pouvez également spécifier votre propre fonction personnalisée pour effectuer les ETags comme suit:

app.set('etag', function(body, encoding){ /* return valid etag */ });

Le package NPM frais vaut également la peine d'être examiné, car il est utilisé dans Express pour vérifier la fraîcheur ( source1 , source2 ).

En ce qui concerne votre application, n'oubliez pas que vous pouvez remplacer tous les en-têtes de réponse, par exemple res.set('etag', 'my-awesome-etag-value') avant d'appeler res.send() (ou fonction similaire). D'autres discussions (y compris les avantages et les inconvénients) peuvent être trouvées ici: https://github.com/visionmedia/express/issues/2129#issue-34053148

41
stellarchariot