一 、why
- 使自己更全面,有大局观
- 提升话语权
- 升职加薪的筹码
二、Node的作用和应用
- 脱离浏览器运行js
- 后台API的编写
Webpack、Gulp、Npm等等- 中间层:服务器中负责IO读写的中间层服务器(
性能好,适合高并发异步IO的数据处理,安全性好,隔离后台)
三、Node的优势
- 便于前端开发入门
- 性能高
- 利于前端代码整合
四、Node环境搭建和运行
- 官网下载
node安装包,傻瓜式一路点击下一步 - 检查是否安装成功
node -V - 运行程序
node xxx.js
五、npm常用命令
npm install xxx //安装包
npm i xxx
npm unstall xxx //卸载包
npm un xxx
npm init //生成package.json文件
npm init -y
npm update xxx //更新包
六、Node三大模块
全局模块
定义:何时何地都能访问,不需要引用,如process
process.env
console.log(process.env);
//returns an object containing the user environment
process.env.foo = "bar";
console.log(process.env.foo);
//bar
delete process.env.foo;
console.log(process.env.TEST);
//undefined
process.argv
console.log(process.argv)
// [ '/Users/xxx/.nvm/versions/node/v10.19.0/bin/node',
'/Users/xxx/Desktop/node/index.js' ]
node ./index.js one two three
// [ '/Users/xxx/.nvm/versions/node/v10.19.0/bin/node',
'/Users/xxx/Desktop/node/index.js',
'one',
'two',
'three' ]
系统模块
定义:需要require(),但不需要单独下载,如path fs
path:用于处理文件路径和目录路径的实用工具
fs:用于文件读写操作
//path 示例
const path = require("path");
console.log(path.dirname("a/b/c/1.jpg"));
// a/b/c
console.log(path.basename("a/b/c/1.jpg"));
// 1.jpg
console.log(path.extname("a/b/c/1.jpg"));
// .jpg
console.log(path.resolve("a/b/c/", "../../", "d"));
// /Users/xx/Desktop/node/a/d
console.log(path.resolve(__dirname, "index.js"));
// /Users/xx/Desktop/node/index.js
//fs 示例
let fs = require("fs");
//读文件
fs.readFile("./a.txt", (err, data) => {
if (err) {
console.log(err);
} else {
console.log(data.toString());
}
});
//写文件
fs.writeFile("a.txt", "hello world!", { flag: "a" }, err => {
if (err) {
throw err;
}
});
自定义模块
定义:require自己封装的模块 export module require
require查找规则
- 如果有路径,就去对应路径查找
- 如果没有就在
node_modules里面查找 - 如果没有就在node的安装目录里面查找
//导出一个值 b.jx
exports.a = 1;
//index.js
const b = require("./b");
console.log(b.a);
//1
//批量导出 b.jx
module.exports = function() {
console.log("hello world");
};
//index.js
const b = require("./b");
b();
// hello world
//导出一个类 b.jx
module.exports = class {
constructor(name) {
this.name = name;
}
show() {
console.log(this.name);
}
};
//index.js
const b = require("./b");
const person = new b("Mary");
person.show();
// Mary
七、核心:http模块
//起一个服务
let http = require("http");
let fs = require("fs");
http
.createServer((req, res) => {
fs.readFile(`./index.html`, (err, data) => {
if (err) {
console.log(err);
res.end("404 not found");
} else {
res.end(data); // res.write(data) res.end()
}
});
})
.listen(3333);
八、Node中的数据交互
前端<--->后端,通过报文进行数据传输,报文包括头和体,头部信息<=32k,体<=2G
GET请求
- 什么是get请求?主要是获取数据
- 数据是放在url里面进行传输
- 容量小:<32k
- 使用
url模块:url.parse(req.url,true)
//index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
<form action="http://localhost:3333/login" method="GET">
用户名 <input type="text" name="username" /> 密码
<input type="password" name="password" />
<input type="submit" value="登陆" />
</form>
</body>
</html>
//index.js
let http = require("http");
let url = require("url");
http
.createServer((req, res) => {
let { pathname, query } = url.parse(req.url, true);
console.log(pathname, query);
})
.listen(3333);
运行node ./index.js,浏览器打开index.html文件,输入用户名和密码,此时终端将输出/login和[Object: null prototype] { username: 'mary', password: '123' }
POST请求
- 数据是放在
体内,容量要小于2G - 使用
querystring:querystring.parse(data)
//index.js
let http = require("http");
let queryString = require("querystring");
http
.createServer((req, res) => {
let result = [];
req.on("data", buffer => {
// 请求数据是以二进制的形式分块发送的
result.push(buffer);
});
req.on("end", () => {
let data = Buffer.concat(result).toString(); //将二进制数据拼接,如果涉及文件或者图片不能用toString
console.log(queryString.parse(data));
});
})
.listen(3333);
将get请求示例中的method='GET'改为method='POST'后,运行如上node ./index.js,输入用户名和密码,此时终端将输出[Object: null prototype] { username: 'mary', password: '123' }
接口设计
- 什么是接口(API)?不同功能层之间的通信规则称为接口
- 参数
- 返回值
九、实战
以上述填写用户名和密码为例,做登录和注册逻辑,此处不涉及数据相关内容
//index.js
let http = require("http");
let url = require("url");
let queryString = require("querystring");
//模拟数据库
const user = {
userName: "mary",
password: "123456"
};
http
.createServer((req, res) => {
res.writeHead(200, {
"Content-Type": "text/plain;charset=utf-8"
});
let path, get, post;
if (req.method === "GET") {
let { pathname, query } = url.parse(req.url, true);
path = pathname;
get = query;
complete();
} else if (req.method === "POST") {
let result = [];
req.on("data", buffer => {
result.push(buffer);
});
req.on("end", () => {
post = queryString.parse(Buffer.concat(result).toString());
path = url.parse(req.url).pathname;
complete();
});
} else {
res.end("请求方法有误");
}
function complete() {
if (path === "/login") {
let { username, password } = get;
if (user.userName !== username) {
res.end(
JSON.stringify({
error: 1,
msg: "用户名不存在"
})
);
} else if (user.password !== password) {
res.end(
JSON.stringify({
error: 1,
msg: "密码有误"
})
);
} else {
res.end(
JSON.stringify({
error: 0,
msg: "登录成功"
})
);
}
}
if (path === "/register") {
let { username, password } = post;
if (!!username && !!password) {
res.end(
JSON.stringify({
error: 0,
msg: "注册成功"
})
);
} else {
res.end(
JSON.stringify({
error: 1,
msg: "请将信息填写完整"
})
);
}
}
}
})
.listen(3333);
九、深入
学习:koa2 MongoDB