2014-06-06 7 views
15

Witam Mam kilka pytań początkujących dotyczących korzystania z res (Express response object) i res.locals w Express.Różnica między przypisaniem do res i res.locals w node.js (Express)

Podczas nauki nodejs w jednym z przykładów kodu Istnieje middleware (messages.js), serwer (app.js) i szablon (messages.ejs). Patrząc na przykładowy kod szablonu. Wygląda na to, że chociaż wiadomości i removeMessages() są przypisane do res.locals. Możesz uzyskać do nich dostęp za pomocą wiadomości lub removeMessages() bez prefiksowania połączenia z miejscowymi. Chciałbym wiedzieć:

  1. Czy wskazują te same przedmioty?
  2. Jeśli są takie same, czy ma znaczenie, czy przypiszę polecenie res direct zamiast res.locals?

Kod próbki

messages.js

var express = require('express'); 
var res = express.response; 
res.message = function (msg, type) { 
    type = type || 'info' 
    var sess = this.req.session; 
    sess.messages = sess.messages || []; 
    sess.messages.push({ 
     type: type, 
     string: msg 
    }); 
}; 
res.error = function (msg) { 
    return this.message(msg, 'error'); 
}; 
module.exports = function (req, res, next) { 
    res.locals.messages = req.session.messages || []; 
    res.locals.removeMessages = function() { 
     req.session.messages = []; 
    }; 
    next(); 
}; 

app.js (częściowe kodu)

var express = require('express'); 
var messages = require('./lib/messages'); 
var app = express(); 
app.use(messages); 

messages.ejs

<% if(locals.messages) { %> 
    <% messages.forEach(function (message) { % %> 
     <p class = '<%= message.type %>' > <%= message.string %> < /p> 
    <% }) %> 
    <% removeMessages(); %> 
<% } %> 

Odpowiedz

21

res.locals to obiekt przekazany do dowolnego aparatu renderującego, z którego korzysta twoja aplikacja (w tym przypadku). Będą "globalne" w renderowaniu, więc nie musisz niczego przed nimi dodawać, aby ich użyć.

Załóżmy, że chcieliśmy, aby nasz serwer przechwytywał nasz kod JavaScript z S3 w trybie produkcyjnym, ale używał lokalnych kopii podczas tworzenia. res.locals to ułatwia. Musielibyśmy middleware wzdłuż tych linii w app.js:

if ('production' === app.get('env')) { 
    res.locals.jsLocation = 'https://s3.amazonaws.com/kittens/js/' 
} else { 
    res.locals.jsLocation = '/js/'; 
} 

i index.ejs byłoby coś takiego:

<script src="<%= jsLocation %>angular.min.js"></script> 
<script src="<%= jsLocation %>myAngularFile.js"></script> 
+2

Więc to znaczy, że jeśli miałbym zrobić kod wymienione poniżej. res.locals.messages jest ujawniony w ejs, podczas gdy \t res.nonLocalmessages nie jest i nie może być dostępny. \t 'module.exports = function (req, res, next) { res.locals.messages = req.session.messages || []; res.nonLocalmessages = req.session.messages || []; next(); }; ' – oREDi

+2

@ user3247380 Masz rację. Możesz odwoływać się do niego w ejs jako 'messages' – SomeKittens

Powiązane problemy