Просто короткое воскресное сообщение (в основном, чтобы избежать стресса из-за моих Святых). Примерно через неделю я опубликовал свою первую попытку создать «настоящее» приложение 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(); }); });
Для тех, кто хочет увидеть полную кодовую базу, я прикрепил ее ниже. Очевидно, вам нужны данные, и если кому-то нужны примеры данных из моего блога, просто спросите.