2015-06-18 2 views
0

Я относительно новичок в веб-разработке и пытаюсь выяснить, как публиковать серверную среду (dev, test, prod и т. Д.) Для интерфейса.Дизайн шаблона как альтернатива внешнему шаблону locals

Я использую Node.js с Express, но следующий код ближе к псевдокоду, потому что это скорее вопрос шаблона проектирования.

Один из способов опубликовать серверную среду с Экспресс, чтобы добавить это промежуточное программное:

app.use(function(req,res,next){ 

    res.locals.env= {}; //we add the property env to locals 

}); 

так что теперь в фронтальном шаблоне мы можем получить доступ к местным жителям «окр» переменная:

<div> 
<% app.env = env %> //hopefully 'env' will be available in a front-end template 
</div> 

Я не уверен, что выше стандартное, но я чувствую, что это, безусловно, не идеально.

Так я думал, возможно, мы могли бы сделать это вместо того, чтобы, как для первого запроса HTTP, первый запрос сокета, или все запросы (?):

// псевдокод ниже

app.get('/', function(req,res,next){ 

    if(req.isAuthenticated()){ 

    socket.on('received-env-info', function(err,msg){ 
      res.render('index',{auth:true}); 
    } 

    socket.emit('send-env-info', env); 
    } 
    else{ 
     res.render('index',{auth:false}); 
    } 

}); 

таким образом, мы можем быть уверены, что клиент знает, что такое среда (или любые другие переменные сервера), прежде чем какой-либо html будет отправлен на сервер. (Мы предполагаем, что на клиенте есть обработчик socket.io, который затем устанавливает глобальное env на клиенте на переменную, которая была отправлена ​​с сервера).

Это хороший дизайн, или плохой?

дополнительный кредит: мы могли бы взять ту же самую идею, и использовать его для аутентификации также:

app.get('/', function(req,res,next){ 

    var infoForClient = {auth:null,env:env}; //should probably set auth to false for security but using 'null' for illustration purposes 

    if(req.isAuthenticated()){ 
      infoForClient.auth = true; 
    } 
    else{ 
      infoForClient.auth = false; 
    } 

    socket.on('received-info-from-client', function(msg){ 
      if(msg === 'success'{ //some success message or another 
       res.render('index',infoForClient); 
      } 
      else{ 
       infoForClient.auth = false; 
       res.render('index',infoForClient); 
      } 

    } 

    socket.emit('send-info-to-client', infoForClient); 
    } 
}); 

Мне просто нужно знать, если это разумный подход или не

ответ

1

Это будет работать, но что выигрыш против

// B 
app.get('/', function(req, res) { 
    res.json({ 
    info: info, 
    html: template.render(info) 
    }); 
}); 

или

// C 
socket.on('get-index', function() { 
    socket.emit('index', { 
    info: info, 
    html: template.render(info) 
    }); 
}); 

или с перемещенным шаблоном на стороне клиента, просто верните информацию.

Как только интеллектуальный клиент находится на картинке, рендеринг серверной части шаблона больше не нужен.

Так, глядя на код клиента

// A 
socket.on('send-info-to-client', function (infoForClient) { 
    handleInfo(infoForClient); 
    socket.emit('recieved-info-from-client', true); 
}); 
request('/', function (err, res, body) { 
    if (err) { return handleErr(err) } 
    handleHtml(body); 
}); 

ручка информации и обрабатывать HTML в конечном итоге раскол на две части.

// B 
request('/', function (err, res, body) { 
    if (err) { return handleErr(err) } 
    handleInfo(body.info); 
    handleHtml(body.html); 
}); 

// C 
socket.emit('get-index'); 
socket.on('index', function (msg) { 
    handleInfo(msg.info); 
    handleHtml(msg.html); 
}); 

обработчики могут быть объединены

и в конечном случае

// D 
request('/', function (err, res, body) { 
    if (err) { return handleErr(err) } 
    handleInfo(body.info); 
    handleHtml(template.render(body.info)); 
}); 
+0

хммм это заставляет меня задаться вопросом, если есть передний конец шаблон дизайна, который гарантирует, что глобальные значения устанавливаются перед любым происходит повторная реновация –

Смежные вопросы