2015-05-25 2 views
7

Мне сложно понять, как именно node.js обслуживает динамический контент. Так скажем, у нас есть следующий код, который отображает домашнюю страницу:Обслуживание динамических веб-страниц с помощью Node.js

var express = require('express'), 
    app = express(); 

app.get('/', function(req,res){ 
    res.render('home.html'); 
}); 

Однако, скажем, эта страница должна была быть профилем, в котором вы тянете информацию пользователя из базы данных, что приводит к код:

var express = require('express'), 
    mongoose = require('mongoose'), 
    app = express(); 

mongoose.connect('mongodb://localhost/ExampleDB'); 

app.get('/:id', function(req,res){ 
    User.findOne({_id: req.id}, function (err, user){ 
     var name = user.name; 
     var profilePic_uri = user.profilePic_uri; 
     res.render('home.html'); 
}); 

Таким образом, в идеале home.html просто шаблон страницы, в котором вы установили возможно пользователя изображение профиля, их имя и т.д. в обработчик маршрута. Правильно, потому что идея за узлом заключается в том, что этот app.js должен иметь возможность обрабатывать вытягивание динамического содержимого из базы данных во время выполнения. Там, где у меня возникают проблемы, понимаешь, как именно рендеринг динамических страниц работает с узлом. Страница html представляет собой статическую страницу. Вы не можете реально отобразить страницу php или asp, потому что, ну, на самом деле это не имеет смысла?

Что оставляет меня с вопросом, как это делается?

+0

Ваш вопрос о Node.js или как Экспресс оказывает динамическое содержимое? – digwig

ответ

4

В вашем случае страница статична. Сюда входит игра шаблонных движков (просмотр движков), с помощью которой вы можете отображать содержимое страницы динамическое.

Некоторые из шаблонов, которые я помню сейчас, это vash (это как синтаксис бритвы от MVC, мне это нравится) и jade. Их больше.

Примечание: Вы можете найти в ссылках, предоставленных мной, как интегрировать их с выразить.

+0

Я немного знаком с нефритом. Их синтаксис немного смущает меня лично. Однако с помощью jade, по моему мнению, вы передаете что-то вроде res.render ('home.jade', {name = user.name, profilePic = user.profilePic}.) ;. Обратите внимание, что это очень грубый sudocode из-за незнания с нефритом и его синтаксисом. В этом случае вы говорите, что такой подход заключается в том, как выполняется выполнение динамических страниц? – cg14

+0

@ cg14 Точно так вы передаете данные на страницу. Вам просто нужно использовать его на странице. Это заставит страницу отображать разные данные на основе запроса. – adricadar

1

Что вы на самом деле спрашиваете, не так, как это работает в узле, но как Express создает шаблоны. Как только вы поймете, что на самом деле вы используете функцию экспресс-модуля, вам, вероятно, больше известно, что вам нужно искать, чтобы получить правильную документацию.

Вкратце: Экспресс имеет механизм рендеринга шаблонов, который выполняет эту работу для вас, очень похожую на то, что делает ASP или PHP.

Чтобы узнать об этом, я бы посоветовал сначала попытаться создать что-то без всех библиотек, чтобы узнать платформу и понять, почему возможно использовать такие библиотеки или фреймворки (например, экспресс) ,

+0

Итак, вы говорите, что механизм рендеринга шаблонов - это способ обойти это? В этом случае, чтобы задать вопрос в некотором смысле, как сделать экспресс-рендеринг шаблонов? – cg14

+1

Да, вы можете использовать движок шаблонов с помощью Express. Есть много вариантов, мой личный фаворит - Swig. Пожалуйста, проверьте [docs] (http://expressjs.com/guide/using-template-engines.html), как устанавливать и настраивать шаблоны (или, как их называют, «представления»). –

7

Если добавить ...

app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 

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

app.get('/', function(req,res){ 
    res.render('home', { 
    var1: 'val1', 
    var2: 'val2' 
    }); 
}); 

Вы должны были бы добавить Джейд в файл package.json вашего проекта в зависимости:

"jade": "~1.9.1", 

... а затем «NPM установить» в папку для принесите это.

Тогда вам понадобится файл с именем/views/home.нефрит с содержимым:

doctype html 
html 
    body 
    p Var1 is #{var1} 
    p Var2 is #{var2} 

Вы должны увидеть - при посещении главной страницы - что значения были переданы рендеринга Джейд и расширена на месте в шаблоне, как «знач1» и «val2 ', соответственно.

0

Вы можете использовать модуль [Templatesjs]1 для визуализации динамического данных

этот модуль делает работу, которую вы хотите легко, вы можете сделать динамические данные HTML страницы с помощью этого.

позвольте мне показать вам пример:

<html> 
    <body> 
    Welcome Dear <%username%> 
    <img src="img/<%pic_url%>" /> 
    </body> 

</html> 

теперь мы должны оказывать имя и pic_url на странице. в ваших Node.js кодов

var express = require('express'), 
    mongoose = require('mongoose'), 
    app = express(), 
    tj = require('templatesjs'); 

mongoose.connect('mongodb://localhost/ExampleDB'); 

app.get('/:id', function(req,res){ 
    User.findOne({_id: req.id}, function (err, user){ 
     var name = user.name; 
     var profilePic_uri = user.profilePic_uri; 
     var data = fs.readFileSync('./home.html'); 

     //now do the main thing 

     tj.set(data); // invoke templatesjs with data 
     var output = tj.render("username",name); // this will replace <%username%> with actual username 

     output = tj.render("pic_url",profilePic_uri); 
     res.write(output); 
     res.end() 
}); 

Теперь вы сделали. Вы можете иметь хорошую помощь от here

Надежда

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