js в браузере VS js в NodeJs
)js в браузере — это синтаксис ECMAScript + веб-API.
js в NodeJs — это синтаксис ECMAScript + Node API.
Как видно из рисунка выше, синтаксис тот же (ECMAScript), но среда другая, предоставляемый API другой и то, что можно сделать, другие. На рисунке не перечислены все API, но видно, что http (связанный со службой http) предоставляется в среде NodeJS. Вы можете позволить NodeJs написать серверную программу.
Front-end разработка vs back-end разработка
Мышление фронтенд-разработки VS мышление бэкенд-разработки
Как было сказано выше, языки программирования являются для нас препятствием для изучения NodeJ, а синтаксис ES.
Первое, что нужно изменить нашему мышлению, — это внешний интерфейс, который запрашивает данные, а затем обрабатывает результат запроса. Серверная часть принимает запросы, а затем возвращает данные в ответ на запросы.
Front-end и back-end фокусируются по-разному, а front-end фокусируется на презентации и взаимодействии. Бэкэнд фокусируется на безопасности и стабильности.
Внешний технологический стек VS внутренний технологический стек
Изучение NodeJs — это большой проект, который заключается в изучении целого набора технологий и освоении стека серверных технологий, прежде чем их можно будет использовать в работе.
Я провожу приблизительное сравнение стеков передних и внутренних технологий:
В серверной части есть некоторые технологии, которые не используются во внешнем интерфейсе, например база данных sql. Есть также некоторые технологии, которые являются общими для внешнего и внутреннего интерфейса, например файлы cookie, и серверная часть также будет обращать внимание на установленные файлы cookie и точки знаний, связанные с сеансом.
Я считаю, что по приведенной выше картинке мы можем понять, на каком уровне технологии находится NodeJs, не просто определенная технология, а Js для серверной разработки.
Прочесывание знаний NodeJs
запустить службу
После изучения NodeJ в целом и изучения деталей первым шагом будет запуск службы:
var http = require("http");
http.createServer(function(request, response) {
// 处理一切
// request接收请求
// response响应请求
}).listen(8888);
Самой важной частью NodeJs является этот код, сервер получает/отвечает на запросы. NodeJs использует метод обратного вызова, где я могу справиться со всем.
маршрутизация
Просто напишите switch для обработки разных запросов.
http.createServer(function(request, response) {
// 从request中获取请求url和method:get/post
switch(url){
case '/api/blog/list':
// 返回博客列表相关代码
break;
case '/api/blog/new':
// 新建博客相关代码
break;
...
case '/api/user/list':
// 返回用户列表相关代码
break;
case '/api/user/new':
// 新建用户相关代码
break;
...
}
}).listen(8888);
В проекте неразумно писать весь код обработки запросов в одном методе, поэтому его нужно разделить. Есть маршрутизация.
Мы помещаем различную обработку запросов в разные файлы, разделенные по бизнес-логике, такой как блог/пользователь:
// app.js
http.createServer(function(req, res) {
handleBlogRouter(req, res)
handleUserRouter(req, res)
}).listen(8888);
// router/blog.js
export default handleBlogRouter(req, res){
...
switch(url){
case '/api/blog/list':
// 返回博客列表相关代码
break;
case '/api/blog/new':
// 新建博客相关代码
break;
...
}
}
// router/user.js
export default handleBlogRouter(req, res){
...
switch(url){
case '/api/user/list':
// 返回用户列表相关代码
break;
case '/api/user/new':
// 新建用户相关代码
break;
...
}
}
Внутренняя маршрутизация концептуально отличается от внешней маршрутизации.Внешняя часть относится к переходам между страницами, а одна страница — это один маршрут. Адрес интерфейса серверной части, который относится к маршруту.
controler
Продолжаем разбивать, пусть роутер тоже несет единую ответственность, и извлекаем бизнес-логику:
// router/blog.js
const {
getBlogList,
newBlog,
...
} = require('../controler/blog')
export default handleBlogRouter(req, res){
...
switch(url){
case '/api/blog/list':
const result = getBlogList(id);
res.json(result);
break;
case '/api/blog/new':
const result = newBlog(body);
res.json(result);
break;
...
}
}
Здесь возвращаемые данные, такие как генерация json или html, помещаются в маршрутизатор, но бизнес-логика размещается в контроллере.
Структура проекта
Структура проекта в основном указана ниже.В случае, когда мы не используем какой-либо фреймворк, нам также необходимо разделить код.
└─bin #启动HTTP服务
│ www.js
├─logs #日志文件
└─src #项目源码
| controler #放controler,业务逻辑
| model #放model,数据模型,数据库操作
| router #路由相关
| utils #工具类文件
| db #数据库相关 mysql,redis等基本服务封装
| config #项目相关配置
├─app.js 主文件,启动文件
Показать адрес исходного кода структуры проекта
В соответствии с этой базовой структурой проекта я написал небольшой проект и загрузил его в Code Cloud.нажмите здесь, чтобы посмотреть
В проекте вы также можете увидеть мою основную обработку запроса, улучшение объекта запроса, включая получение синтаксического анализа пути, синтаксический анализ запроса, настройку файлов cookie, инкапсуляцию сеанса и инкапсуляцию после запроса. Установите объект ответа, например, установите формат возврата в JSON.
база данных
Первое, что нужно сделать, это выбрать базу данных, я выбрал mysql. Знаком с инструментами баз данных и использовать операторы sql.
- Установить базу данных, установить клиент визуализации базы данных
- nodejs подключается к базе данных, записывает код в папку db, затем записывает оператор sql в папку модели, а затем вызывает метод, инкапсулированный в модели, в контроллере.
куки, сессия, редис
Эти три точки знания связаны между собой. Все дело в хранении состояния.
HTTP не имеет состояния. Для записи состояния необходимо использовать файлы cookie. Для записи более защищенной информации на стороне сервера требуется сеанс. Чтобы лучше использовать память на стороне сервера и повысить стабильность, необходима база данных Redis в памяти.
Наиболее типичным приложением является запись статуса входа в систему. Используйте файл cookie для записи ключа, используйте сеанс для хранения конфиденциальной информации пользователя или сохраните сеанс в Redis.
файловые операции
Серверу нужны файловые операции, а при обнаружении больших файлов ему также необходимо использовать потоковые операции.
Наиболее типичным приложением является работа с журналом.
Безопасность
Незаменимой частью контента на стороне сервера является контент безопасности, размещения xss-атак, sql-инъекций и т. д.
express
Поняв все аспекты разработки на стороне сервера, вы можете приступить к работе с фреймворком, который в настоящее время широко используется.
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
Можно использовать скаффолдинг, такой как экспресс-генератор, и интегрировать такие модули, как сгенерированные проекты и журналы маршрутизации.
npm install -g express-generator
Использование промежуточного программного обеспечения
Основным механизмом фреймворка является механизм подключаемых модулей. Когда приходит запрос, плагин обрабатывает его и передает следующему плагину, после обработки он передается следующему, обрабатывается один за другим, и, наконец, плагин, отвечающий за бизнес вернет результат ответа.
Это разделяет обязанности. Пусть каждый плагин относится к одной задаче. И это прогрессивно.Например, связанный метод работы с файлами cookie, инкапсулированный предыдущим плагином, следующий плагин может получить соответствующий метод в объекте запроса для обработки бизнеса.
koa2
Узнав об экспрессе, легко начать работу с Koa. В отличие от экспресса, во-первых, добавлена асинхронность, а во-вторых, механизм подключаемых модулей стал луковой моделью.
app.use(async (ctx, next) => {
await next();
var data = await doReadFile();
ctx.response.type = 'text/plain';
ctx.response.body = data;
});
Основной механизм плагина не изменился, а также было достигнуто разделение различных обязанностей по обработке запроса.
koa2 также имеет соответствующие леса
npm install -g koa-generator
обратный прокси nginx
Так как на нашем сервере развернуты и front-end, и back-end, то необходим обратный прокси для выделения, какие из которых запрашивают front-end ресурсы, а какие запрашивают back-end ресурсы.
заключительные замечания
Я просто знакомлюсь с Node, и эта статья — только общее введение в общую разработку NodeJ. Если вы хотите хорошо изучить nodeJ, вам все еще нужно много реальных боев и освоить некоторые концепции и технологии серверной разработки. Поймите его рабочий механизм и принцип на практике.