2014-06-06 13 views
15

Ciao Ho alcune domande da principianti sull'utilizzo di res (Express response object) e res.locals in Express.Differenza tra l'assegnazione a res e res.locals in node.js (Express)

Mentre si studia il nodojs in uno degli esempi di codice, vi è un middleware (messages.js), un server (app.js) e il modello (messages.ejs). Esaminare il codice di esempio per il modello. Sembra che sebbene i messaggi e removeMessages() siano assegnati a res.locals. Puoi accedervi usando i messaggi o removeMessages() senza prefisso alla chiamata con i locali. Desidero sapere quanto segue:

  1. Stanno indicando gli stessi oggetti?
  2. Se sono uguali, importa se assegno a res direct anziché res.locals?

Codice Esempio

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 (codice parziale)

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(); %> 
<% } %> 

risposta

21

res.locals è un oggetto passato a qualsiasi motore di rendering utilizzato dall'app (in questo caso ejs). Saranno "globali" nel rendering, quindi non è necessario anteporre nulla a loro per utilizzarli.

Diciamo che volevamo che il nostro server prendesse il nostro JavaScript da S3 quando era in modalità di produzione, ma utilizza le copie locali quando è in fase di sviluppo. res.locals rende questo facile. Avremmo middleware lungo queste linee in app.js:

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

e index.ejs sarebbe qualcosa di simile:

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

Quindi cosa significa che se dovessi fare il codice elencato di seguito. res.locals.messages è esposto negli ejs mentre \t res.nonLocalmessages non è e non è possibile accedervi. \t 'module.exports = function (req, res, next) { res.locals.messages = req.session.messages || []; res.nonLocalmessages = req.session.messages || []; successivo(); }; ' – oREDi

+2

@ user3247380 Hai ragione. Puoi fare riferimento a ejs come 'messaggi' – SomeKittens