一、简介
Nodejs,作为一个js的运行环境
用途:
1、运行在服务区,作为web server (用途最多)
2、运行在本地,作为打包、构建工具。
注意点:
1、Nodejs运行在服务端,而非浏览器坏境
2、服务端开发的思路和套路,与前端完全不一样。
使用原生代码开发案例项目
- 实现API和数据存储,使用mysql数据库
- 从0实现登录,并使用redis存储登录信息
- 安全,日志记录和日志分析
二、安装和准备
安装
1、npm官网和node官网
2、如果使用多个版本,推荐使用nvm
nodejs和javascript的区别
ECMAScript:
定义了语法,不能操作DOM,不能处理http请求,不能操作文件
js:
1、使用了ES的语法规范,加Web API,缺一不可。
2、DOM操作、BOM操作
nodejs
1、使用ES语法规范,外加nodejs API
2、俩者结合,即可完成server端的任何操作。
补充
1、commonjs模块化
使用模块化符合单一值原则和开放封闭原则,把功能相近的拆出去,去别的地方引用。
导入导出
function add(a, b){
return a + b;
}
function mul(a, b){
return a * b;
}
module.exports = {
add,
mul
};
const { add, mul } = require('./a');
const sum = add(10, 20);
const result = mul(10, 20);
console.log(sum)
console.log(result)
初始化npm环境
npm init -y
引入lodash
const _ = require(‘lodash’);
2、nodejs debugger
server开发和前端开发的区别
1、服务稳定性
(1)server端可能会遭受各种恶意攻击和误操作
(2)单个客户端可以意外挂掉,但是服务端不能
(3)使用PM2做进程守候。
2、考虑CPU和内存(优化、扩展)
(1)客户端占用一个浏览器,内存和CPU都不是问题
(2)server端要承载很多请求,CPU和内存都是稀缺资源
(3)会用stream写日志,使用redis存session
3、日志记录
(1)前端也会参与写日志,但只是日志的发起发,不关心后续
(2)server端要记录日志、存储日志、分析日志、前端不关心
(3)多种日志记录方式,分析日志。
4、安全
(1)server端要随时准备接收各种恶意攻击,前端则少很多,如越权操作,数据库攻击等(写文章提交会攻击数据,如把数据都删了)
(2)登录验证,预防xss攻击和sql注入
5、集群和服务拆分
1、产品发展速度快,流量可能会迅速增加。
2、通过扩展机器和服务拆分来承载流量
3、虽然是单机器开发,但是从设计上支持服务拆分。
三、博客项目介绍
一个项目的全部步骤:
定目标,定需求,定UI设计,定技术方案,开发,联调,测试,上线,结果
1、目标
开发一个博客系统,具有博客的基本功能
只开发server端,不关心前端
2、需求
首页、作者主页、博客详情页
登录页
管理中心,新建页,编辑页
3、技术方案
1、数据如何存储
2、如何与前端对接,即接口设计
4、数据存储
1、博客
2、用户
5、存储用户
6、接口设计
7、关于登录
1、业界有统一的解决方案,一般不用再重新设计
2、实现起来比较复杂
四、开发博客项目之接口
4-1 http概述
开发接口(不用任何框架)
1、nodejs处理http请求
2、搭建开发环境
3、开发接口(暂不链接数据库,暂不考虑登录)
DNS解析,建立TCP连接,发送http请求
server端接收http请求,处理,并返回
客户端接收到返回数据,处理数据(如渲染页面,执行js)
80端口是http的默认端口,443是https的默认端口。
4-2 nodejs处理http请求
1、get请求和url参数(querystring)
2、post请求和postdata
3、路由
const http = require('http')//获取原生的http模块
const server = http.createServer((req, res) => {
res.writeHead(200, {'content-type':'text/html'})
res.end(
'<h1>hello world</h1>'//结束了返回了什么
)
})//返回一个server对象
server.listen(3000, () => {
console.log('listening on 3000 port')
})//监听本地端口号
处理get请求
1、get请求,即客户端要向server端获取数据,如查询博客列表
2、通过querystring来传递数据,如a.html?a=100&b=200
3、浏览器之间访问,发送get请求
nodejs处理get请求
/favicon.ico 浏览器自带的请求,表示唯一标识的图标
const http = require('http')
const querystring = require('querystring')//获取原生的querystring模块
const server = http.createServer((req, res) => {
console.log('method:', req.method)//GET
const url = req.url//获取请求的完整url
console.log('url:', url)
req.query = querystring.parse(url.split('?')[1])//将参数解析为JSON对象
console.log('query:', req.query)
res.end(
JSON.stringify(req.query)//将querystring返回
)
})
server.listen(8000)
console.log('OK')
4-3 nodejs处理post请求
1、客户端要向服务端发送(传递数据)如新建博客
通过post data传递数据
浏览器无法直接模拟,需要手写js,或者使用postman
const http = require('http')
const server = http.createServer((req,res) => {
if(req.method === 'POST'){
//req数据格式
console.log('req content-type', req.headers['content-type'])//请求头中的请求类型
//接收数据
let postData = ''
req.on('data', chunk => {
postData +=chunk.toString()//chunk二进制格式的数据,变成字符串的格式
})
req.on('end', () => {
console.log('postData:', postData)
res.end('hello world!')
})
}
})
server.listen(8000)
console.log('OK')
2、nodejs处理路由
代表的是资源url唯一的标识
4-4处理http请求的综合实例
4.5搭建开发环境
1、从0搭建
2、使用nodemon检测文件变化,自动重启node
cnpm--save-dev nodemon
3、使用cross-env设置环境变量
cnpm--save-dev cross-env
4、启动项目
cnpm run dev
4-6开发接口
1、初始化路由
2、返回假数据:将路由与数据处理分离
4-7开发路由(博客列表路由)
4-8开发路由,博客详情路由
4-9开发路由,处理POSTData
在app.js中用promise异步处理post data,req body即为post data(向后端传递的数据)
4-10新建和更新博客
新建:
1、在controller里面引入对象(blogData),对象包括文章标题,内容,return 出一个id,表示插入数据表id,输出此函数
2、在router中引入上述,把req.body作为参数传到函数中
更新:
更新一篇博客需要id,发送的内容
1、在controller中写入数据,return出正确与否
2、在router中引入上述
4-11删除博客路由和登录路由
删除:
只需要前端提供的一个id就可以了
1、在controller中建一个方法
2、在router中引入,传入id
登录:
需要验证用户名和密码
1、在controller中假定用户名和密码
2、在router中传入username和password
路由总结:
为何将router和controller分开?
router中表示来了路由,如何
controller中只管数据,来了参数就处理数据。