一、nodejs与javascript的区别
1.1 ECMAScript
- 不能操作DOM 不能监听click事件,不能发送ajax请求
- 不能处理http请求 不能操作文件
- 只有ECMAScript不能做任何实际的项目
1.2 javascript
- 使用ECMAScript语法规范 外加Web API
- DOM操作 BOM操作 事件绑定 Ajax
- 两者结合 即可完成浏览器端任何操作
1.3 nodejs
- 使用ECMAScript语法规范 外加nodejs API 缺一不可
- 处理http 处理文件
- 两者结合 完成server端的操作
{
"name": "debugger-test",
"version": "1.0.0",
"description": "",
"main": "index.js", // 重要 入口文件
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
// app.js
const http = require('http');
// 用http模块创建一个服务 服务端返回两个参数req,res
const server = http.createServer((req,res)=>{
res.writeHead(200,{
'content-type': 'text/html' // 返回的信息格式是html格式
})
res.end('<h1>hello world</h1>') // 返回的具体内容
})
server.listen(3000,()=>{
console.log('listening on 3000 port')
})
1.4 server端开发和前端开发的区别
- 服务稳定性
- server端可能会遭受各种恶意攻击和误操作
- 单个客户端可以意外挂掉,但是服务端不能
- 使用PM2做进程守候 -- 指进程一旦挂掉会自动重启 不用人工
- 考虑内存和CPU(优化,扩展)
- 客户端独占一个浏览器,内存和CPU都不是问题
- server端要承载很多请求,CPU和内存都是稀缺资源
- 使用stream写日志(优化),使用redis存session(扩展)
- 日志记录 对server端非常重要
- 前端也会参与写日志,但只是日志的发起方,不关心后续
- server端要记录日志,存储日志,分析日志,前端不关心
- 多种日志记录方式,如何分析日志,根据不同情况选择不同的日志记录的方式
- 安全 前端可以轻易攻破 但server端不会轻易被攻破
- server端要随时准备接收各种恶意攻击,前端则很少
- 如:越权操作,数据库攻击
- 登录验证 预防xss攻击和sql注入
- 集群和服务拆分 server端承载的流量越来越大
- 产品发展速度快,流量可能会迅速增加
- 通过扩展机器和服务拆分来承载大流量
二、项目分析
2.1 项目实现目标
- 开发一个博客系统 具有博客的基本功能
- 只开发server端,不关心前端
2.2 项目需求分析
- 首页,作者主页,博客详情页
- 登录页
- 管理中心,新建页,编辑页
2.3 项目技术方案
- 数据如何存储
- 博客


- 如何与前端对接,即接口设计

三、开发接口
// app.js
const http = require('http');
// 用http模块创建一个服务 服务端返回两个参数req,res
const server = http.createServer((req,res)=>{
res.writeHead(200,{
'content-type': 'text/html' // 返回的信息格式是html格式
})
res.end('<h1>hello world</h1>') // 返回的具体内容
})
server.listen(8000,()=>{
console.log('listening on 8000 port')
})
3.1 从输入url到页面渲染的过程?
- DNS解析(解析到一个IP地址),客户端和服务器端建立TCP连接,发送http请求
- 客户端找到服务器,会三次握手
- 第一次握手:客户端询问服务器 是否可以用
- 第二次握手:服务器端告诉客户端可用
- 第三次握手:客户端告诉服务器端,即将访问 发送http请求
-
- server端接收到http请求,处理,并返回
-
nodejs处理http请求
-
get请求和querystring(url参数)
- get请求 即客户端要向server端获取数据,如查询博客列表
- 通过querystring来传递数据,如a.html?a=100&b=200
- 浏览器直接访问,就发送get请求
const http = require('http'); const querystring = require('querystring'); const server = http.createServer((req,res)=>{ console.log(req.method) // GET const url = req.url // 获取请求的完整url req.query = querystring.parse(url.split('?')[1]) // 解析querystring res.end(JSON.stringify(req.query));//将querystring返回 }); server.listen(8000);
-
post请求和postdata
- 客户端要像服务端传递数据,如新建博客
- 通过postData传递数据
- 浏览器无法直接模拟,需要手写js,或者使用postman
-
- server端接收到http请求,处理,并返回
const http = require('http');
const server = http.createServer((req,res)=>{
if(req.method === 'POST'){
// 数据格式
conssole.log('content-type', req.headers['content-type']);
// 接受数据
let postData = "";
req.on('data',chunk=>{
postData += chunk.toString()
});
req.on('end',()=>{
console.log(postData);
res.end('hello world'); //在这里返回,因为是异步
})
}
});
server.listen(8000);
- 路由(接口地址)
const http=require('http');
const server = http.createServer((req,res)=>{
const url= req.url;
const path = url.split('?')[0];
res.end(path); //返回路由
});
server.listen(8000);
- 客户端接收到返回数据,处理数据(如渲染页面,执行JS)
四、博客项目
4.1 搭建环境
-
blog-1
- bin
- www.js
- app.js 存放http.createServer()内的回调函数
- bin
-
npm init -y
入口文件改成"main": "bin/www.js",
-
yarn add nodemon cross-env --save-dev
安装nodemon
可以监控文件变化 可以自动重启node 不需要手动重启cross-env
识别当前的环境 开发环境-dev 线上环境-production
//package.json "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "cross-env NODE_ENV=dev nodemon ./bin/www.js" },
-
npm run dev
4.2 开发接口-初始化路由
- 返回假数据:将路由和数据处理分离,以符合设计原则