24Nov

express_21n

Всем привет! Для того чтобы дальше разрабатывать это приложение, нам нужно сделать еще две важные вещи , а именно, конфигурация и логирование. Для того чтобы конфигурировать, будем использовать модуль nconf:

npm i nconf

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

 nconf.argv()
   .env()
   .file({ file: 'path/to/config.json' });

означает: прочитать конфигурацию из командной строки, из переменных окружений и из файла.  Сейчас создадим директорию config, в ней же создам index.js, а в ней подключим nconf. Затем в нее скопируем конфигурацию из документации немного ее изменив (файл будет из текущей директории)  указываем путь:

var nconf = require('nconf');
var path = require('path');

nconf.argv()
    .env()
    .file({ file: path.join(__dirname, 'config.json') });

module.exports = nconf;

В первом config (создадим файл config внутри нашей новой директории  – config.json) напишем: port: 3000.

{
  "port": 3000
}

Подключаем модуль configв app.js:

var config = require('config');

 немного изменяя конфигурацию запуска, чтобы оно находило этот модуль, нужно добавить NODE_PATH.
node_path
Также в app.js добавляем метод config.get
:

app.set('port', config.get('port'));

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + config.get('port'));
});

Проверим – работает.

Следующее, что нужно сделать, это поставить логгер:

npm i winston

Будем использовать свою обертку над winston. Для того чтобы было ее куда положить,  сделаем директорию libs. В нее  будем класть те модули и файлы, которые никуда не выпадают, но куда-то положить их нужно. В данном случае логирование – файл log.js, (создадим его), который будет в этой директории. Вот пример такой обертки:

var winston = require('winston');
var ENV = process.env.NODE_ENV;

// can be much more flexible than that O_o
function getLogger(module) {

    var path = module.filename.split('\\').slice(-2).join('\\');
    return new winston.Logger({
        transports: [
            new winston.transports.Console({
                colorize: true,
                level: (ENV == 'development') ? 'debug' : 'error',
                label: path
            })
        ]
    });
}

module.exports = getLogger;

Получаем окружение. В нашем файле log.js будем брать окружение напрямую с NODE_ENV. Чтобы это работало, добавим в конфинурацию запуска NODE_ENV development.

node_path2

Что делает эта обертка? Если кто-то подключает логгер (добавим запись в app.js) , например:

var log = require('libs/log')(module);

то функция getLogger берет модуль и генерирует для него специальный объект логгера. В нем могут быть  включены какие-то транспорты, какие-то отключены, стоять правильный уровень логирования и.т.д, единственная разница – метка. Давайте посмотрим, что это такое, как оно будет работать.

Берем логгер и вместо console.log делаем log.info:

http.createServer(app).listen(app.get('port'), function(){
  log.info('Express server listening on port ' + config.get('port'));
});

Запускаем. Логгер выводит, во-первых, все разными цветами, во-вторых,  если  development, то он выводит debug уровень и выше, а если остается на production, тогда error. В данном случае – development, поэтому мы все видим.

Кроме того, у этого логгера есть метка:

....\node_js_lessons\app.js]

то есть, из какого файла вообще пришла эта запись. Иногда бывает очень интересно узнать. Соответственно, берем module.filename и получаем 2 последних элемента пути. Теперь время двигаться дальше.

Мы займемся тем, что выведем нормальную HTML страницу. У нас есть какие-то Middleware, мы их порежем и возьмем Middleware, которые у нас были встроены в Express. Нам нужны настройки

// app.set('views', __dirname + '/views');
// app.set('view engine', 'ejs');

Это настройки для системы шаблонизации, движок для шаблонов у нас будет ejs. Директорию views переименуем в templates. Вместо него может быть и какая-то другая система шаблонизации, их достаточно много. Порт  вообще убираем, потому что его в app писать совершенно нет смысла:

// app.set('port', process.env.PORT || 3000);
app.set('port', config.get('port'));<br>

Сделаем нормальный config, и из него будем брать настройку. а также добавим остальные Middlewares которые у нас есть. Наш app.js станет выглядеть так:

var express = require('express');
var http = require('http');
var path = require('path');
var config = require('config');
var log = require('libs/log')(module);


var app = express();
app.set('views', __dirname + '/templates');
app.set('view engine', 'ejs');

app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('your secret here'));
app.use(express.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

app.use(function(err, req, res, next) {
  // NODE_ENV = 'production'
  if (app.get('env') == 'development') {
    var errorHandler = express.errorHandler();
    errorHandler(err, req, res, next);
  } else {
    res.send(500);
  }
});

// var routes = require('./routes');
// var user = require('./routes/user');

// // all environments

// app.get('/', routes.index);
// app.get('/users', user.list);


http.createServer(app).listen(config.get('port'), function(){
  log.info('Express server listening on port ' + config.get('port'));
});

Оставайтесь с нами, в следущей статье мы продолжим!

Код урока доступен по ссылке.

to-be-continued-series-8

Материалы для статьи взяты из следующего скринкаста.

We are looking forward to meeting you on our website soshace.com

 

3. Уроки Express.js. Шаблонизация с EJS: Layout, Block, Partials

В реальной жизни у нас обычно больше, чем один шаблон. Более того, если уж так получилось, что мы делаем сайт со страницами, то, как правило, бывает так, что у нас множество страниц есть в одинаковом оформлении. Шаблонная система должна это предусматривать. К сожалению, ejs не очень хорошо с этим справляется. Поэтому, мы сейчас поставим немного другую систему для шаблонизации , которая называется ejs-locals(добавим в app.js)

Leave a Reply