Nodejs, sql и сайт: управление электроникой через интернет

MySQL

Подключение к MySQL

Для работы с сервером MySQL в Node.js можно использовать ряд драйверов. Самые популярные из них mysql и mysql2. По большей части они совместимы. В данном случае мы будем использовать mysql2, так как, судя по ряду тестов, он предоставляет большую производительность.

Итак, установим пакет mysql2:

Создание подключения

Для создания подключения применяется метод createConnection() , который в качестве параметра принимает настройки подключения и возвращает объект, представляющий подключение.

Передаваемые в метод настройки конфигурации могут содержать ряд параметров. Наиболее используемые из них:

host : хост, на котором запущен сервер mysql. По умолчанию имеет значение “localhost”

port : номер порта, на котором запущен сервер mysql. По умолчанию имеет значение “3306”

user : пользователь MySQL, который используется для подключения

password : пароль для пользователя MySQL

database : имя базы данных, к которой идет подключение. Необязательный параметр. Если он не указан, то подключение идет в целом к северу

charset : кодировка для подключения, например, по умолчанию используется “UTF8_GENERAL_CI”.

timezone : часовой пояс сервера MySQL. This is used to type cast server date/time values to JavaScript. По умолчанию имеет значение “local”

Для установки подключения мы можем использовать метод connect() объекта connection:

Метод connect() принимает функцию, параметр которой содержит ошибка, которая возникла при подключении.

Возможные ошибки при подключении

Если при подключении к серверу mysql генерируется ошибка

В этом случае необходимо в MySQL Workbench выполнить следующую команду:

Вместо ‘password’ должен быть указан пароль от MySQL для пользователя root.

Закрытие подключения

Для закрытия подключения применяется метод end() :

При запуске приложения и удачном подключении-закрытии подключения мы увидим на консоли:

Метод end() гарантирует, что перед закрытием подключения к бд будут выполнены все оставшиеся запросы, которые не завершились к моменту вызова метода.

Если мы не вызовем этот метод, то подключение будет оставаться активным, и приложение Node.js продолжит свою работу, пока сервер MySQL не закроет подключение.

Если же нам надо немедленно закрыть подключение, не дожидаясь выполнения оставшихся запросов, то в этом случае можно применить метод destroy() :

Управляем электроникой через Интернет с помощью NodeJS, SQL и сайта

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

Мы уже касались данной темы в рубрике “Умный дом”. Но сегодня мы остановимся подробнее на том, как контролировать любое электрическое устройство из любого места на Земле с помощью Интернета. Хотелось, чтобы этот проект расширил понимание программирования, веб-разработки и того, как лучше сделать простой, но эффективный проект.

Аппаратное обеспечение поддерживается минимально, поэтому можно больше сосредоточиться на программном обеспечении. Поэтому мы будем иметь дело с простым светодиодом и потенциометром.

Потенциометр отправит данные, а светодиод их получит (яркость, широтно-импульсная модуляция (PWM)). Используя NodeJS, последовательные данные будут прочитаны (значение потенциометра) и записаны (яркость светодиода). Трудная часть этого проекта заключалась в получении входных данных из удаленного места (веб-сервера).

Компоненты и программы

Аппаратное обеспечение:

  • Arduino Uno, Nano, Mega (большинство плат с последовательным подключением будут работать);
  • Один светодиод и резистор ограничения тока. Используйте наш калькулятор, если вы в чем-то не уверены – Калькулятор Ома;
  • 10K потенциометр.

Программное обеспечение:

  • Arduino IDE;
  • Node.JS (это программное обеспечение на компьютере, очень простое в установке);
  • MySQL сервер (самый простой способ – найти дешевый веб-хостинг и вы также сможете получить бесплатные доменные имена).

Используемые языки программирования и скрипты:

Arduino (измененный C/C++), JavaScript (Nodejs), PHP, HTML и CSS.

Логика программного обеспечения: системная архитектура

Потенциометр

Начинать нужно с Arduino, чтение значения потенциометра в последовательном мониторе. Однако на этот раз мы будем использовать Node.JS для чтения значения. NodeJS откроет последовательную связь с тем же портом к которому подключена Arduino, и прочитает значение потенциометра.

Затем NodeJS загрузит данные в удаленную базу данных SQL, это будет происходить каждый раз, когда будет выведено новое значение. Веб-страница будет подключаться через определенные интервалы к базе данных SQL и будет извлекать значение потенциометра. Затем это будет отображаться на веб-странице.

Светодиод

Для светодиодов яркость PWM будет установлена ​​пользователем на удаленной веб-странице. Входные данные сохраняются в базу данных SQL, через каждый установленный интервал база данных проверяется на изменения в PWM, это выполняется NodeJS. Если значение отличается от предыдущего значения, новое значение будет отправлено в Arduino через последовательную шину. Arduino изменяет значение выходного PWM светодиода, чтобы изменить его яркость.

V = IR

P = IV = I²R = V²/R

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

Поскольку синий светодиод имеет более высокую частоту по сравнению с чем-то вроде красного светодиода. Это означает более высокое прямое напряжение. В зависимости от типа и размера рабочий диапазон будет отличаться. Для проекта использован резистор 220 Ом последовательно, отрицательная нога на землю и положительная на ШИМ (PWM) пин на Arduino.

Потенциометр подключен к аналоговому выходу. 5VCC на один конец, GND на другой и средний вывод подключен к аналоговому выводу (A0 в нашем случае). См. ниже.

Схема соединения

Здесь всё достаточно просто: подключите свой токоограничивающий резистор последовательно со светодиодом, убедитесь, что вы правильно всё соединили. Один конец пойдет на GND (земля), а другой конец на пин Arduino. В нашем случае мы использовали пин 12 для светодиода и A7 для потенциометра. Вы можете сделать по-своему или аналогично схеме представленной выше.

Код для Ардуино

Во-первых, светодиод и потенциометр были проверены, работают ли они как ожидалось. Это делается простой программой, в которой значение потенциометра контролирует светодиод. Была использована функция ограничения для изменения диапазона вместо 0-1023 до 0-255, но простое деление на 4 (“. /4”) работает. Значение потенциометра было сглажено, взято среднее значение из 10 последовательных показаний, это для удаления пиков. Однако это сглаживание вызвало проблемы с NodeJS, так что это было удалено позже из проекта.

Чтение / запись

Следующим шагом было получение данных через последовательный монитор, предоставляемый Arduino IDE для установки яркости. Для этого используется serial.parseInt(), который принимает целочисленное значение и игнорирует строки. Кроме того, в код добавляется проверка ошибок. Допустимый диапазон значения PWM равен 0 – 255, когда пользователь вводит> 255, тогда он присваивает значение 255, и если пользователь вводит значение или NodeJS

На всякий случай – мы не сможем показать вам здесь как установить и настроить SQL-сервер, есть множество учебных пособий.

Существует 3 основных аспекта программ NodeJS:

  • Чтение последовательных данных
  • Запись последовательных данных
  • Обновление базы данных SQL

Чтобы выполнить последовательное соединение в NodeJS, необходимо загрузить модуль с именем serialport, можно выполнить с помощью команды npm. Откройте CMD в папке, где будет храниться программа NodeJS, установите, набрав: npm install serialport.

Также необходимо установить модуль SQL, чтобы иметь возможность подключаться к базе данных sql: npm install mysql.

NodeJS – Последовательный порт

Первым шагом с NodeJS было прочитать данные и отправить яркость pwm в Arduino. Это было сделано путем открытия последовательного соединения с той же скоростью и портом. После установления соединения читаем входящие сообщения и выводим их в окне консоли. Проблема возникла, когда была попытка записать значение pwm для управления яркостью. Ошибка: Port Not Open.

Первоначальное решение заключалось в том, чтобы вызвать функцию записи, когда есть входные данные. Однако это был плохой костыль, и решение было так себе, хотя работало, и отправляло только когда значение потенциометра было изменено. Код примера для последовательного модуля не работал, либо показывал ту же ошибку. Позже стало понятно, что программа пыталась выполнить функцию записи, не открывая порт, что привело к этой ошибке. Столкнуться с этой проблемой можно, используя функцию setInterval().

NodeJS – MySQL

Библиотека MySQL использовалась (npm install MySQL) для подключения к базе данных SQL. Для удаленного сервера вместо локального хоста (localhost) использовался IP-адрес сервера.

var con содержит информацию о соединении в формате JSON, как только соединение успешно выполнено, к базе данных можно обратиться. Были созданы 2 функции – одна для обновления таблицы и другая для работы с параметрами, взятыми в SQL-запросе. Таблица обновлений вызывается, когда принимается новое значение потенциометра, и запрос проверки яркости будет выполняться периодически.

Веб-интерфейс

Основная веб-страница была написана на PHP. Для отображения данных sql используется таблица html и form.

CSS стили и Javascript

Добавляем CSS стили и JS:

Итоговый результат

На видео ниже показан процесс работы с проектом.

На этом всё. Желаем вам отличных проектов и побольше новых изобретений.

Работаем с SQL Server в Node.js (с использованием SQL запросов)

Node.Js поддерживает работу со всеми популярными системами управления базами данных. Microsoft SQL Server не исключение.

В репозитории npm существует целый ряд пакетов, которые позволяют работать с этой СУБД. Однако все их можно условно разделить на две большие группы в зависимости от реализуемого подхода.

Непосредственная работа с базой данных c использованием SQL запросов;

Сопоставление объектной модели и структуры базы данных посредство ORM.

В данной статье речь пойдёт о первом подходе.

Установка клиента для SQL Server

Для того чтобы выполнить запрос к базе данных SQL Server в Node. js существует целый ряд библиотек. Мы воспользуемся библиотекой @frangiskos/mssql, которая основана на node-mssql и предоставляет достаточно простой интерфейс для работы.

Библиотека имеет открытый исходный код, который доступен на GitHub (https://github.com/frangiskos/mssql).

Установить её можно при помощи npm следующей командой:

Подключение к базе данных

Чтобы подключиться к базе данных необходимо подключить библиотеку к проекту и создать объект SqlConfig , в котором описаны параметры подключения.

Ниже приведён пример указанных операций:

Далее нужно передать объект SqlConfig в метод init объекта sql.

Если подключение завершено успешно, можно выполнять запросы к базе данных при помощи метода query, но о нём позже.

Так как метод init ничего не возвращает, обработать ошибку подключения можно только при помощи блока try-catch.

Запрос на выборку

Запрос на выборку данных выполняется при помощи метода query/ Этот метод обычно принимает как минимум один параметр – строку с текстом запроса. Остальное — параметры запроса (о них мы поговорим позже).

Ниже показан пример, получения всех записей из таблицы:

Метод query возвращает Promise. Поэтому данные мы можем получить только в методе then или при помощи async/await.

Записи из таблицы возвращаются в виде JSON массива, где каждый элемент представляет собой JSON объект с полями соответствующими структуре таблицы.

Например, для таблицы, которая включает поля id (целое число) и testValue (nvarchar), массив с результатами будет выглядеть приблизительно так:

Запрос без выборки данных

Если запрос не предполагает получения данных из базы ( UPDATE, INSERT, CREATE и т. д.), он выполняется аналогичным образом. Единственное отличие состоит только в том, что в этом случае нет необходимости обрабатывать возвращаемые данные в приложении. Поэтому, метод then можно использовать только для контроля успешного выполнения запроса.

Ниже показан пример запроса на выполнение хранимой процедуры:

Как мы видим при помощи библиотеки @frangiskos/mssql можно спокойно работать с SQL Server используя синтаксис Transact-SQL.

Значение входного параметра хранимой процедуры передаётся непосредственно в строке запроса, что чревато далеко идущими последствиями. Поэтому настоятельно рекомендуется в подобных случаях применять запросы с параметрами (параметрические запросы), речь о которых пойдёт ниже.

Параметрический запрос

Библиотека @frangiskos/mssql поддерживает параметрические запросы.

Для этой цели предусмотрен специальный синтаксис.

Параметры в тексте запроса обозначаются как @P и далее номер параметра (обязательно), начиная с 1.

Обратите внимание, что подобные имена параметров являются заерезервированными.

Значения параметров запроса передаются как параметры метода query ( начиная со второго параметра, первый всегда строка запроса).

Далее представлен предыдущий пример, который был изменён для использования параметрического запроса.

Метод query, ранее принимавший только один параметр, теперь принимает два. Строку запроса и значение параметра.

Количество используемых параметров не ограничено.

Сопоставление параметров запроса их значениям осуществляется слева направо. То есть, второй параметр метода query — @P1, третий — @P2, четвёртый — @P3 и т. д.

Например, такой запрос к рассмотренной ранее тестовой таблице вернёт не все пять значений, а только два.

Результат будет уже таким:

Специализированные методы

В принципе, изложенное выше, это всё, что необходимо знать для успешной работы с SQL Server в Node.js при помощи @frangiskos/mssql. Но, возможности библиотеки этим не ограничиваются.

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

Первый из них queryOne — полный аналог query, но возвращает только первую из выбранных записей. Этот метод избавляет от необходимости использовать « TOP 1» в SQL запросах.

Второй insertReturn >Promise. Поэтому, значение идентификатора доступно только в методе then или с использованием async/await.

Но, даже несмотря на это роль метода insertReturnIdentity переоценить сложно, так как благодаря ему полностью отпадает потребность поиска только, что добавленной записи.

Также стоит обратить внимание на методы q, q1 и ii.

Эти методы по сути являются псевдонимами для query, queryOne и insertReturnIdentity соответственно. Они позволяют сократить объём кода за счёт краткости. Но, стоит ли приносить качество кода в жертву подобной «оптимизации» уже решать вам.

На этом, мы завершаем рассмотрение библиотеки @frangiskos/ mssq l .

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

Простой сайт с возможностью авторизации на node.js

Теория

Есть такое понятие, как сессия — период времени, пока пользователь находится на сайте. Сессия начинается, когда пользователь впервые открывает сайт в браузере и заканчивается, когда у нее истечет срок действия (или когда сайт захочет ее прервать). С каждой сессией связывается определенный набор данных:

  • уникальный идентификатор сессии
  • срок действия
  • имя пользователя (если он его введет)
  • другая служебная информация, необходимая для идентификации: ip-адрес, user agent
  • любая другая информация, которую сайт связывает с текущим пользователем. Например, электронный магазин может хранить в сессии список товаров, добавленных в корзину.

Для решения нашей задачи нужны две таблицы в базе данных: одна для хранения данных сессии, другая — для информации о пользователях. На самом деле, в данном случае говорить «таблица БД» не совсем правильно, информация может находиться в разных местах. Например, всю параметры сессии можно хранить в cookies (или в памяти приложения, хотя это и нехорошо). Данные о пользователе могут поступать извне, если он заходит с помощью OpenID/OAuth.

Connect

Всю работу по созданию сессии connect берет на себя. Для этого нужно добавить два правила:

Порядок имеет значение, сами правила должны быть определены до задания маршрутов. Первое правило обеспечивает работу с куками в общем. Второе добавляет к обычному request поле session , через которое будут доступны данные сессии (дальше с примерами станет понятнее).

connect.session получает такие параметры:

  • secret — фраза, которая используется для шифрования информации в cookies.
  • store — обьект, который будет использоваться для хранения данных сессии. По умолчанию connect хранит все данные в памяти, но, естественно, в реальных приложениях так делать нельзя. Есть готовые решения для mongodb, redis, MySQL и т.д.
  • cookie — набор параметров cookie. Самый важный — maxAge , время жизни в миллисекундах (или null)

Авторизация

Как уже было сказано, connect будет добавлять поле session к каждому запросу, но по умолчанию там ничего интересного нет. Если мы каким-то образом «узнаем» пользователя (собственно, если он введет правильный пароль), мы должны будем сами добавить информацию о нем к сессии. Приблизительно так:

В принципе, хватило бы одной переменной username (так делает автор вот этой статьи). Но тогда проверка, авторизирован ли пользователь, будет выглядеть некрасиво:

Когда пользователь захочет разлогиниться, достаточно будет просто удалить добавленные поля:

Для полной очистки есть метод session.destroy(). Он удаляет session из текущего запроса, а при следующем это поле будет сгенерировано заново.

Контроль доступа

Наиболее очевидное решение — проверять request.session.authorized всякий раз, когда нужно сгенерировать защищенную страницу. Собственно, так и делают в статье, на которую я уже ссылался. Проблема в том, это противоречит «слоистой» идеологии connect . Лучше задать специальное правило, которое будет проверять права пользователя и, если что не так, перенаправлять его на страницу ошибки. Идея описана здесь, в нашем случае будет

Все. Надеюсь, это кому-нибудь поможет.

Источники:

http://arduinoplus.ru/upravlyaem-elektronikoi-cherez-internet-arduino-nodejs-sql/

http://streletzcoder.ru/rabotaem-s-sql-server-v-node-js-s-ispolzovaniem-sql-zaprosov/

http://habr.com/post/145970/

http://portal-pk.ru/news/166-wi-fi-rele-na-nodemcu-upravlenie-android-prilozheniem.html

Ссылка на основную публикацию