Интеграция с базами данных
Содержание:
- API
- Обновление до версии генератора приложений Express 4
- Why Do We Use Session in Web Application ?
- Serving Static Files
- Installing Express
- Route-Specific Whitelists and Blacklists
- GET Method
- Пример миграции приложения
- POST Method
- Это маршрут? Это контроллер?
- Пути маршрутов
- MIT License
- Example
- Usage
- StrongLoop Process Manager
API
constpaginate=require('express-paginate');
This creates a new instance of .
This middleware validates and supplies default values to (an alias of , which can be used to skip or offset a number of records for pagination, e.g. with Mongoose you would do ), , , , , and .
- a Number to limit results returned per page (defaults to )
- a Number to restrict the number of results returned to per page (defaults to ) – through this, users will not be able to override this limit (e.g. they can’t pass and crash your server)
When you use the middleware, it injects a view helper function called as , which you can use in your views for paginated hyperlinks (e.g. as the in or ).
By default, the view helper is already executed with the inherited variable, therefore it becomes a function capable of returning a String when executed.
When executed with , it will return a function with two optional arguments, (Boolean) and (String).
The argument is a Boolean and is completely optional (defaults to ).
The argument is an Object and is completely optional.
Pass as the value for when you want to create a or that points to the previous page (e.g. it would generate a URL such as the one in the attribute of if is ).
Pass an object for the value of when you want to override querystring parameters – such as for filtering and sorting (e.g. it would generate a URL such as the one in the attribute of if is equal to .
Note that if you pass only one argument with a type of Object, then it will generate a with the current page and use the first argument as the value for . This is useful if you only want to do something like change the filter or sort querystring param, but not increase or decrease the page number.
req (required) – the request object returned from Express middleware invocation
- (optional) – a Boolean to determine whether or not to increment the hyperlink returned by (e.g. for «Next» page links)
- (optional) – an Object of querystring parameters that will override the current querystring in (note that this will also override the querystring value if is present as a key in the object) (e.g. if you want to make a link that allows the user to change the current querystring to sort by name, you would have equal to )
When you use the middleware, it injects a view helper Boolean called as , which you can use in your views for generating pagination ‘s or ‘s – this utilizes to determine the Boolean’s resulting value (representing if the query has a previous page of results)
When you use the middleware, it injects a view helper function called as , which you can use in your views for generating pagination ‘s or ‘s – if the function is executed, it returns a Boolean value (representing if the query has another page of results)
By default, the view helper is already executed with the inherited variable, therefore it becomes a function capable of returning a Boolean when executed.
When executed with , it will return a function that accepts two required arguments called and .
req (required) – the request object returned from Express middleware invocation
pageCount (required) – a Number representing the total number of pages for the given query executed on the page
Get all the page urls with limit.
req (required) – the request object returned from Express middleware invocation
- (optional) – Default: 3, a Number representing the total number of pages for the given query executed on the page.
- (required) – a Number representing the total number of pages for the given query executed on the page.
- (required) – a Number representing the current page.
Обновление до версии генератора приложений Express 4
Инструмент командной строки для генерации приложений Express остается неизменным —
, но для обновления его до новой версии необходимо удалить установку
генератора приложений Express 3, а затем установить новый .
Установка
Если в системе уже установлен генератор приложений Express 3, его необходимо удалить:
В зависимости от настроек прав доступа к файлам и каталогам, эту команду, возможно, следует вызвать с помощью .
Теперь установите новый генератор:
В зависимости от настроек прав доступа к файлам и каталогам, эту команду, возможно, следует вызвать с помощью .
Итак, команда в вашей системе обновлена до версии генератора
Express 4.
Изменения генератора приложений
Опции команд и их использование, в основном, остались без изменений, за исключением следующих:
- Удалена опция .
- Удалена опция .
- Добавлена опция для поддержки Hogan.js.
Пример
Выполните следующую команду для создания приложения Express 4:
Обратив внимание на содержимое файла , вы заметите, что все функции
промежуточной обработки (кроме ), обязательные для приложения, загружаются
как независимые модули, а промежуточный обработчик больше не загружается в приложение явным образом. Также вы заметите, что файл теперь является модулем Node.js, а не самостоятельным приложением, которое генерировалось старой версией генератора
Также вы заметите, что файл теперь является модулем Node.js, а не самостоятельным приложением, которое генерировалось старой версией генератора.
После установки зависимостей запустите приложение с помощью следующей команды:
Обратив внимание на сценарий запуска npm в файле ,
вы заметите, что, фактически, командой, запускающей приложение, является
, которой в Express 3 соответствовала команда. Поскольку файл , созданный генератором Express 4, теперь является модулем
Node.js, его уже нельзя запускать отдельно как приложение (если не изменить код)
Модуль необходимо загрузить в файл Node.js и запустить через файл Node.js. В данном случае, файлом Node.js является
Поскольку файл , созданный генератором Express 4, теперь является модулем
Node.js, его уже нельзя запускать отдельно как приложение (если не изменить код). Модуль необходимо загрузить в файл Node.js и запустить через файл Node.js. В данном случае, файлом Node.js является .
Ни каталог , ни файл без расширения
не являются обязательными для создания приложения Express или запуска такого приложения. Это всего лишь
рекомендованные генератором значения, которые можно менять в соответствии с вашими потребностями.
Для того чтобы избавиться от каталога и оставить все, “как было в Express 3”,
удалите строку в конце файла
, а вместо нее вставьте следующий код:
Убедитесь в том, что вы загрузили модуль в начало файла с помощью следующего кода:
Далее, замените в файле на .
Итак, функциональность была перемещена обратно в
. Такое изменение не является рекомендованным, но цель данного упражнения заключалась в том, чтобы помочь вам разобраться в принципах работы файла и понять, почему файл теперь нельзя запускать как самостоятельный.
Why Do We Use Session in Web Application ?
Session help to store data across application and pages into the server side. The web application worked upon HTTP protocol. The HTTP is stateless So application doesn’t know about previous request or activity, The Session help to solve this problem.
Different Ways to Store Session in Nodejs
You can store session following ways into the ExpressJS application. These are common ways to store session data in any programming languages.
- Cokkie : You can store session into cookie, but it will store data into client side.
- Memory Cache : You can also store session data into cache.As we know, Cache is stored in memory.You can use any of the cache module like Redis and Memcached.
- Database :The database is also option to store session data server side.
Nodejs Session Connection with MySQL
Nodejs have mysql module to connect nodejs application with mysql.We will install ‘mysql’ package and add below code into server.js file to create db connection.
var mysql = require(‘mysql’);
var connection = mysql.createConnection({
host : ‘localhost’,
user : ‘root’,
password : »,
database : ‘dummy_db’
});
connection.connect(function(err) {
if (err) throw err
console.log(‘You are now connected…’)
})
1 |
varmysql=require(‘mysql’); varconnection=mysql.createConnection({ host’localhost’, user’root’, password», database’dummy_db’ }); connection.connect(function(err){ if(err)throwerr console.log(‘You are now connected…’) }) |
Nodejs Session Connection with Memcached
The nodejs have connect-memcached module to connect Memcached with nodejs application.We can use connect-memcached to store session into memory.
var MemcachedStore = require(‘connect-memcached’)(session);
app.use(cookieParser());
app.use(session({
secret : ‘some-private-key’,
key : ‘test’,
proxy : ‘true’,
store : new MemcachedStore({
hosts: , //Memcached server host url
secret: ‘123, ABC’ // Optionally use transparent encryption for memcache session data
})
}));
1 |
varMemcachedStore=require(‘connect-memcached’)(session); app.use(cookieParser()); app.use(session({ secret’some-private-key’, key’test’, proxy’true’, storenewMemcachedStore({ hosts’127.0.0.1:11211′,//Memcached server host url secret’123, ABC’// Optionally use transparent encryption for memcache session data }) })); |
Serving Static Files
Express provides a built-in middleware express.static to serve static files, such as images, CSS, JavaScript, etc.
You simply need to pass the name of the directory where you keep your static assets, to the express.static middleware to start serving the files directly. For example, if you keep your images, CSS, and JavaScript files in a directory named public, you can do this −
app.use(express.static('public'));
We will keep a few images in public/images sub-directory as follows −
node_modules server.js public/ public/images public/images/logo.png
Let’s modify «Hello Word» app to add the functionality to handle static files.
var express = require('express'); var app = express(); app.use(express.static('public')); app.get('/', function (req, res) { res.send('Hello World'); }) var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("Example app listening at http://%s:%s", host, port) })
Save the above code in a file named server.js and run it with the following command.
$ node server.js
Now open http://127.0.0.1:8081/images/logo.png in any browser and see observe following result.
Installing Express
Firstly, install the Express framework globally using NPM so that it can be used to create a web application using node terminal.
$ npm install express --save
The above command saves the installation locally in the node_modules directory and creates a directory express inside node_modules. You should install the following important modules along with express −
-
body-parser − This is a node.js middleware for handling JSON, Raw, Text and URL encoded form data.
-
cookie-parser − Parse Cookie header and populate req.cookies with an object keyed by the cookie names.
-
multer − This is a node.js middleware for handling multipart/form-data.
$ npm install body-parser --save $ npm install cookie-parser --save $ npm install multer --save
Route-Specific Whitelists and Blacklists
New in version 0.2.x is the ability to add whitelist elements in a route. express-winston adds a object to the uest, containing , and .res` properties, to which you can set an array of ‘whitelist’ parameters to include in the log, specific to the route in question:
router.post('/user/register',function(req,res,next){req._routeWhitelists.body='username','email','age';req._routeWhitelists.res='_headers';});
Post to would give you something like the following:
Blacklisting supports only the property.
router.post('/user/register',function(req,res,next){req._routeWhitelists.body='username','email','age';req._routeBlacklists.body='username','password','confirm-password','top-secret';req._routeWhitelists.res='_headers';});
GET Method
Here is a simple example which passes two values using HTML FORM GET method. We are going to use process_get router inside server.js to handle this input.
<html> <body> <form action = "http://127.0.0.1:8081/process_get" method = "GET"> First Name: <input type = "text" name = "first_name"> <br> Last Name: <input type = "text" name = "last_name"> <input type = "submit" value = "Submit"> </form> </body> </html>
Let’s save above code in index.htm and modify server.js to handle home page requests as well as the input sent by the HTML form.
var express = require('express'); var app = express(); app.use(express.static('public')); app.get('/index.htm', function (req, res) { res.sendFile( __dirname + "/" + "index.htm" ); }) app.get('/process_get', function (req, res) { // Prepare output in JSON format response = { first_name:req.query.first_name, last_name:req.query.last_name }; console.log(response); res.end(JSON.stringify(response)); }) var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("Example app listening at http://%s:%s", host, port) })
Accessing the HTML document using http://127.0.0.1:8081/index.htm will generate the following form −
Now you can enter the First and Last Name and then click submit button to see the result and it should return the following result −
{"first_name":"John","last_name":"Paul"}
Пример миграции приложения
Ниже приводится пример миграции приложения Express 3 в Express 4.
Рассмотрим файлы и .
Приложение версии 3
Рассмотрим приложение Express v.3, включающее в себя следующий файл :
Сопутствующий ему файл версии 3, может выглядеть примерно так:
Процесс
Процесс миграции начинается с установки обязательных промежуточных обработчиков для приложения Express 4 и обновления Express и Pug до соответствующих последних версий с помощью следующей команды:
Внесите в файл следующие изменения:
-
Встроенные функции промежуточной обработки Express ,
, ,
, и
более не доступны в объекте
. Необходимо вручную установить соответствующие им альтернативные объекты и загрузить их в приложение. -
Функцию загружать не нужно.
Она не является действительным объектом приложения Express 4, поэтому удалите код
. -
Убедитесь в том, что функции промежуточной обработки загружаются в соответствующем порядке, — загрузите после загрузки маршрутов приложения.
Приложение версии 4
При запуске указанной выше команды будет выполнено обновление следующим образом:
Затем удалите недействительный код, загрузите обязательные промежуточные обработчики и внесите остальные необходимые изменения. Файл будет иметь вид:
Если вам не нужно работать непосредственно с модулем (socket.io/SPDY/HTTPS), загружать его не обязательно, а приложение можно просто запустить следующим образом:
Запустите приложение
Процесс миграции завершен, и данное приложение теперь является приложением версии
Express 4. Для подтверждения запустите приложение с помощью следующей команды:
Загрузите http://localhost:3000. Будет отображена домашняя страница в Express 4.
POST Method
Here is a simple example which passes two values using HTML FORM POST method. We are going to use process_get router inside server.js to handle this input.
<html> <body> <form action = "http://127.0.0.1:8081/process_post" method = "POST"> First Name: <input type = "text" name = "first_name"> <br> Last Name: <input type = "text" name = "last_name"> <input type = "submit" value = "Submit"> </form> </body> </html>
Let’s save the above code in index.htm and modify server.js to handle home page requests as well as the input sent by the HTML form.
var express = require('express'); var app = express(); var bodyParser = require('body-parser'); // Create application/x-www-form-urlencoded parser var urlencodedParser = bodyParser.urlencoded({ extended: false }) app.use(express.static('public')); app.get('/index.htm', function (req, res) { res.sendFile( __dirname + "/" + "index.htm" ); }) app.post('/process_post', urlencodedParser, function (req, res) { // Prepare output in JSON format response = { first_name:req.body.first_name, last_name:req.body.last_name }; console.log(response); res.end(JSON.stringify(response)); }) var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("Example app listening at http://%s:%s", host, port) })
Accessing the HTML document using http://127.0.0.1:8081/index.htm will generate the following form −
Now you can enter the First and Last Name and then click the submit button to see the following result −
{"first_name":"John","last_name":"Paul"}
Это маршрут? Это контроллер?
Самое интересное что маршрут это функция, содержащая логику. Внутри маршрута находится функция res.render:
В шаблоне представления мы видим это:
Это два примера того, как мы можем вытащить данные из controller/route и вывести их в представлении. В этом примере мы выводим HTML:
Всё это, кажется, вытекает из проблемы — может ли маршрут также содержать информацию контроллера? Это верно, поэтому есть движение в обществе за то, чтобы изменить имя папки с routes на controllers.
Отличный пример этого можно увидеть в примере Express MVC.
Но ради логичности в этом руководстве мы будем держаться текущих соглашений.
Пути маршрутов
Пути маршрутов, в сочетании с методом запроса, определяют конкретные адреса (конечные точки), в которых могут быть созданы запросы. Пути маршрутов могут представлять собой строки, шаблоны строк или регулярные выражения.
В Express для сопоставления путей маршрутов используется path-to-regexp; в документации к path-to-regexp описаны все возможные варианты определения путей маршрутов. Express Route Tester — удобный инструмент для тестирования простых маршрутов в Express, хотя и не поддерживает сопоставление шаблонов.
Строки запросов не являются частью пути маршрута.
Ниже приводятся примеры путей маршрутов на основе строк.
Данный путь маршрута сопоставляет запросы с корневым маршрутом, .
Данный путь маршрута сопоставляет запросы с .
Данный путь маршрута сопоставляет запросы с .
Ниже приводятся примеры путей маршрутов на основе шаблонов строк.
Приведенный ниже путь маршрута сопоставляет и .
Этот путь маршрута сопоставляет , , и т.д.
Этот путь маршрута сопоставляет , , , и т.д.
Данный путь маршрута сопоставляет и .
Символы ?, +, * и () представляют собой подмножества соответствующих им регулярных выражений. Дефис (-) и точка (.) интерпретируются буквально в путях на основе строк.
Примеры путей маршрутов на основе регулярных выражений:
Данный путь маршрута сопоставляет любой элемент с “a” в имени маршрута.
Данный маршрут сопоставляет и , но не , и т.д.
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the «Software»), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Example
A simple example using to store page views for a user.
var express =require('express')var parseurl =require('parseurl')var session =require('express-session')var app =express()app.use(session({ secret'keyboard cat', resavefalse, saveUninitializedtrue}))app.use(function(req,res,next){if(!req.session.views){req.session.views={}}var pathname =parseurl(req).pathnamereq.session.viewspathname=(req.session.viewspathname||)+1next()})app.get('/foo',function(req,res,next){res.send('you viewed this page '+req.session.views'/foo'+' times')})app.get('/bar',function(req,res,next){res.send('you viewed this page '+req.session.views'/bar'+' times')})
Usage
Use with your express session middleware, like this:
var express = require('express'); var app = module.exports = express(); var session = require('express-session'); var MySQLStore = require('express-mysql-session')(session); var options = { host: 'localhost', port: 3306, user: 'session_test', password: 'password', database: 'session_test' }; var sessionStore = new MySQLStore(options); app.use(session({ key: 'session_cookie_name', secret: 'session_cookie_secret', store: sessionStore, resave: false, saveUninitialized: false }));
The session store will internally create a which handles the (re)connection to the database. By default, the pool consists of 1 connection, but you can override this using the option. There are additional you can provide, which will be passed to the constructor of the connection pool.
The sessions database table should be automatically created, when using default options. If for whatever reason the table is not created, you can find the schema here.
With an existing MySQL connection or pool
To pass in an existing MySQL database connection or pool, you would do something like this:
var mysql = require('mysql'); var session = require('express-session'); var MySQLStore = require('express-mysql-session')(session); var options = { host: 'localhost', port: 3306, user: 'db_user', password: 'password', database: 'db_name' }; var connection = mysql.createConnection(options); // or mysql.createPool(options); var sessionStore = new MySQLStore({}/* session store options */, connection);
To cleanly close the session store:
sessionStore.close();
Options
Here is a list of all available options:
var options = { // Host name for database connection: host: 'localhost', // Port number for database connection: port: 3306, // Database user: user: 'session_test', // Password for the above database user: password: 'password', // Database name: database: 'session_test', // Whether or not to automatically check for and clear expired sessions: clearExpired: true, // How frequently expired sessions will be cleared; milliseconds: checkExpirationInterval: 900000, // The maximum age of a valid session; milliseconds: expiration: 86400000, // Whether or not to create the sessions database table, if one does not already exist: createDatabaseTable: true, // Number of connections when creating a connection pool: connectionLimit: 1, // Whether or not to end the database connection when the store is closed. // The default value of this option depends on whether or not a connection was passed to the constructor. // If a connection object is passed to the constructor, the default value for this option is false. endConnectionOnClose: true, charset: 'utf8mb4_bin', schema: { tableName: 'sessions', columnNames: { session_id: 'session_id', expires: 'expires', data: 'data' } } };
Configurable sessions table and column names
You can override the default sessions database table name and column names via the option:
var session = require('express-session'); var MySQLStore = require('express-mysql-session')(session); var options = { host: 'localhost', port: 3306, user: 'session_test', password: 'password', database: 'session_test', schema: { tableName: 'custom_sessions_table_name', columnNames: { session_id: 'custom_session_id', expires: 'custom_expires_column_name', data: 'custom_data_column_name' } } }; var sessionStore = new MySQLStore(options);
Debugging
uses the debug module to output debug messages to the console. To output all debug messages, run your node app with the environment variable:
This will output log messages as well as error messages from .
If you also might need MySQL-related debug and error messages, see .
StrongLoop Process Manager
StrongLoop Process Manager (StrongLoop PM) — это рабочий диспетчер процессов для приложений Node.js. В StrongLoop PM предусмотрено встроенное распределение нагрузки, мониторинг, развертывание на нескольких хостах и графическая консоль.
С помощью StrongLoop PM можно выполнять следующие задачи:
- Компоновать, объединять в пакет и развертывать приложение Node.js в локальной или удаленной системе.
- Просматривать профайлы CPU и моментальные снимки кучи в целях оптимизации производительности и диагностирования утечек памяти.
- Поддерживать постоянную активность процессов и кластеров.
- Просматривать показатели производительности приложения.
- Без затруднений управлять развертываниями на нескольких хостах с интеграцией Nginx.
- Объединять несколько диспетчеров StrongLoop PM в распределенную среду выполнения микрослужб, управляемую из Arc.
Работать с StrongLoop PM можно посредством многофункционального интерфейса командной строки, называемого , или графического инструмента Arc. Arc имеет открытый исходный код и обеспечен экспертной поддержкой StrongLoop.
Дополнительная информация содержится на странице http://strong-pm.io/.
Полная версия документации:
- Управляющие приложения Node (Документация StrongLoop)
- Использование StrongLoop Process Manager.
Основы использования
Просмотр состояния диспетчера процессов и всех развернутых приложений:
Вывод списка всех приложений (служб), подлежащих управлению:
Остановка приложения:
Перезапуск приложения:
Также можно выполнить “мягкий перезапуск”, при котором рабочим процессам выделяется определенное время на закрытие существующих соединений, после чего текущее приложение перезапускается:
Удаление приложения из числа подлежащих управлению: