Статьи

Обновление для моего блогового движка Node

Просто короткое воскресное сообщение (в основном, чтобы избежать стресса из-за моих Святых). Примерно через неделю я опубликовал свою первую попытку создать «настоящее» приложение Node.js с помощью Express. Моей целью было создать простой интерфейс для моей базы данных блогов. Это дало мне достаточно простое приложение для изучения Node / Express, а также большого количества данных. Я смог немного обновить приложение и подумал, что поделюсь тем, что сделал. Как и прежде, пожалуйста, не рассматривайте эту лучшую разработку Node.js / Express. Я все еще очень рано в своем образовании Node.

Одно из первых изменений, которые я смог сделать, — это мой механизм просмотра. В предыдущем сообщении в блоге я упоминал, что не был фанатом синтаксиса, который использовал EJS. Как напоминание, вот как это выглядит:

<h2>Blog</h2>

<ul>
<%
    entries.forEach(function(entry) {
        var d = new Date(entry.posted);
        var year = d.getFullYear();
        var month = d.getMonth()+1;
        var day = d.getDate();
%>
    <li><a href="/<%= year + '/' + month + '/' + day %>/<%= entry.alias %>"><%= entry.title %></a> (<%= entry.posted %>)</li>
<% }) %>
</ul>

Я смог переключить свой двигатель обзора на тот, который использовал Handlebars. Пакет узлов hbs позволяет вам использовать Handlebars в ваших HTML-шаблонах. Таким образом, вышесказанное становится более приятным:

<h2>Blog</h2>

<ul>
{{#each entries}}
    <li><a href="{{bloglink this.posted this.alias}}">{{this.title}}</a> ({{this.posted}})</li>
{{/each}}
</ul>

Чтобы быть справедливым к EJS, я также добавил вспомогательную функцию bloglink, чтобы упростить создание ссылки в стиле SES. Чтобы сделать мое приложение еще более стильным (хе), я добавил layout.html на страницу просмотров. Это автоматически оборачивает мои взгляды:

<!doctype html>
<html>
<head>
    <link rel="stylesheet" href="/static/styles.css" />
    <title>{{title}}</title>
</head>

<body>

<header>Ray's Blog</header>

{{{body}}}

<p>
<a href="/">Home</a>
</p>

</body>
</html>

Очевидно, что это не полный шаблон, но он дает вам основную идею. Две вещи, которые я хочу назвать здесь. Три вещи на самом деле.

Во-первых, обратите внимание на использование {{{body}} }. Здесь будет вставлен ранее обработанный вид.

Во-вторых, обратите внимание на использование {{title}} сверху. Пока я устанавливаю значение заголовка при рендеринге моего представления, оно будет выбрано и использовано, например, проверьте код, который отображает запись в блоге:

app.get("/:year/:month/:day/:alias", function(req, res) {
    var entryDate = new Date(req.params.year,req.params.month-1,req.params.day);
    blog.getBlogEntry(entryDate,req.params.alias,function(entry,comments) {
        res.render("entry", {entry:entry,comments:comments,title:entry.title});
    },function() {
        res.writeHead(302, {
            'Location': '/'
        });
        res.end();
    });
});

Видите третий аргумент, переданный для рендеринга? Вот где я поддержал динамическое название для записи в блоге.

Напоследок — обратите внимание на ссылку CSS. Не забывайте, что Express позволяет легко настроить папку со статическими файлами, которые может использовать ваше приложение. Такие вещи, как файлы CSS и библиотеки JavaScript. Вот как я это сделал:

app.use('/static', express.static(__dirname + "/public",{maxAge:86400000}));

Так что для меня — возможность использовать руль огромна. Мне намного удобнее, чем EJS, и я почувствовал себя намного более продуктивным, когда создавал приложение. Я думаю, волнение — это хорошо.

Я сделал еще несколько изменений, которыми хочу поделиться. Как я упоминал в моем предыдущем посте, app.js — это основной файл приложения для вашего файла Node.js. Это, конечно, не единственный файл, но он является критически важным руководителем всего, что делает ваш сайт. С учетом вышесказанного у меня возникает ощущение, что я должен держать вещи как можно более чистыми.

В качестве примера я построил служебную библиотеку, которая позволила бы мне определять помощников Handlebars (например, функции форматирования). Это сохранило мой app.js немного чище. Вот его текущая версия с общим количеством одного помощника. Я добавлю больше позже.

getHelpers = function() {

var helpers = [];

helpers.push({name:"bloglink", helper:function(date, alias) {
var d = new Date(date);
var year = d.getFullYear();
var month = d.getMonth()+1;
var day = d.getDate();
return '/'+ year + '/' + month + '/' + day +'/'+ alias;
}});

return helpers;
};

exports.addHelpers = function(hb) {
var helpers = getHelpers();
for(var i=0, len=helpers.length; i<len; i++) {
hb.registerHelper(helpers[i].name, helpers[i].helper);
}
return hb;
};

Мой app.js может быть немного проще:

var hbs = require('hbs');
//loads in a library of helpers and adds them to hbs
var helpers = require('./helpers.js');
hbs = helpers.addHelpers(hbs);

Наконец, я также удалил пользовательский код RSS из app.js. Я переместил это в мою библиотеку блога вместо этого. Вот как это выглядит в app.js (и это хороший 1/5 размера):

app.get("/blog.rss", function(req, res) {

    blog.getRSS(function(xml) {
        res.writeHead(200, {'Content-Type':'application/rss+xml'});
        res.write(xml);
        res.end();
    });

});

Для тех, кто хочет увидеть полную кодовую базу, я прикрепил ее ниже. Очевидно, вам нужны данные, и если кому-то нужны примеры данных из моего блога, просто спросите.

Скачать прикрепленный файл