Node.js是什么?
Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,用了一个事件驱动、非阻塞式I/O模型, [1] 让JavaScript 运行在服务端的开发平台。
vscode控制台运行nodemon server.js 报错:
npm全局安装包所在的位置
C:\Users\你的用户名\AppData\Roaming\npm\node_modules
解决方法
- 管理员身份打开vscode
- 在powerShell终端中输入set-ExecutionPolicy RemoteSigned
- 选择Y或A即可
服务器架构设计示例图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-leppJY25-1649720473287)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220306213820291.png)]
1.特性
node.js可以解析js代码(没有浏览器安全级别的限制)提供很多系统级别的api,如:
- 文件的读写(File Stystem)
- 进程的管理(Process)
- 网络通信(HTTP/HTTPS)
- node.js是不存在跨域的
- …
2.举例
2.1 浏览器安全级别的限制
ajax测试:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div>browser-safe-sandbox</div>
<script>
const xhr = new XMLHttpRequest();
xhr.open(
"get",
"http://m.maoyan.com/ajax/moreClassicList?sortId=1&showType=3&limit=10&offset=30&optimus_uuid=A5518FF0AFEC11EAAB158D7AB0D05BBBD74C9789D9F649898982E6542C7DD479&optimus_risk_level=71&optimus_code=10"
);
xhr.send();
</script>
</body>
</html>
浏览器预览
browser-sync start --server --files ** / * --directory
2.2文件的读写
读文件
读取文件时,如果不设置编码格式,输出的是Buffer
可以通过设置utf转为字符串,或者使用toString()进行转换
// 导入fs
const fs = require("fs");
// 不设置utf-8编码则是乱码
fs.readFile("./home.txt", "utf-8", (err, res) => {
if (err) {
console.log("读取文件失败");
}
console.log(res);
});
写文件
fs.writeFile("create.txt", "这是node创建出来的文件", (err, res) => {
if (err) {
console.log("文件创建失败");
}
});
2.3进程的管理
function main(argv) {
console.log(argv);
}
// 将传入的参数转为数组,进行截取
main(process.argv.slice(2));
终端运行进程
node index.js a1 a2
2.4http的使用
// 导入http
const http = require("http");
const app = http.createServer((req, res) => {
// let url = req.url;
// res.write(url);
res.writeHead(200, {
// 内容输出的格式,text/plain:表示直接输出,不解析html
// application/json 返回的是一个json对象
// text/html 解析html标签
"content-type": "text/plain",
});
res.write("<div>hello world</div>");
res.end();
});
app.listen("8081", () => {
console.log("服务器启动成功");
});
get请求
// 导入http,https
const http = require("http");
const https = require("https");
const app = http.createServer((req, res) => {
https.get("https://www.xiaomiyoupin.com/mtop/mf/cat/list", (result) => {
let data = "";
result.on("data", (chunk) => {
data += chunk;
});
result.on("end", () => {
res.writeHead(200, {
"content-type": "application/json;charset=utf-8",
});
res.write(data);
res.end();
});
});
});
app.listen("8081", () => {
console.log("服务器启动成功");
});
post请求
const http = require("http");
// querystring是将对象转为表单格式的字符串,so querystring只能用于application/x-www-form-urlencoded的情况。
const querystring = require("querystring");
const datas = querystring.stringify({
province: "上海",
city: "上海",
district: "宝山区",
address: "同济支路199号智慧七立方3号楼2-4层",
latitude: 43.0,
longitude: 160.0,
message: "求购一条小鱼",
contact: "13666666",
type: "sell",
time: 1571217561,
});
let options = {
protocol: "http:",
hostname: "localhost",
method: "post",
port: 8000,
path: "/data",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"Content-Length": Buffer.byteLength(datas),
},
};
const server = http.createServer((req, res) => {
const request = http.request(options, (result) => {});
request.write(datas);
res.write(datas);
request.end();
res.end();
});
server.listen("8000", () => {
console.log("localhost:8000");
});
events
// 通过events方法创建事件
const EventEmitter = require('events');
class MyEventEmitter extends EventEmitter {};
const event = new MyEventEmitter();
event.on('play',(value) => {
console.log(value);
})
event.on('demo',(value) => {
console.log(value);
})
// play方法名,223实参
event.emit('play','223');
event.emit('demo','demo数据');
解析URL
// 导入url模块
let url = require("url");
// 需要解析的url
let newUrl = "https://www.bilibili.com/video/BV1i7411G7kW?p=9";
// 解析url
let urlObj = url.parse(newUrl);
// 解析url后可以得到url的协议,域名,端口号,路由,参数等等
console.log(urlObj);
路由的使用
req是从前端拿数据,res则是向前端传送数据
const http = require("http");
const fs = require("fs");
const mime = require('mime');
// 路由跳转
const server = http.createServer((req, res) => {
let url = req.url;
// 静态路由
// switch (url) {
// case "/":
// res.end("欢迎来到首页");
// break;
// case "/home":
// fs.readFile("./home.html", "utf-8", (err, content) => {
// res.end(content);
// });
// break;
// case "/pic.png":
// fs.readFile("./abg.png", (err, content) => {
// res.end(content);
// });
// break;
// default:
// res.end("没有找到页面404");
// }
// 动态路由
// 以文件名为路由拼接域名
const file = fs.readFileSync(`.${url}`);
const type = mime.getType(url.split('.')[1]);
res.writeHead(200, {
// 设置接口请求头的数据类型
'content-type':type
})
res.end(file);
});
server.listen(8083, () => {
console.log("服务器已启动");
});
中间件的理解
body-parser的使用
如果直接使用req.body来获取请求时的参是获取不到的,可以通过中间件body-parser来获取
npm i body-parser -S
一定要在路由之前注册中间件,因为的执行机制是从上而下的
从官方的图解中可以看出,node中间件类似于vue中的路由拦截器
全局中间件函数
中间件的分类
绑定到app身上的是应用级别中间件,应用级别的中间件也就是全局中间件,绑定到router身上的是路由级别中间件
自定义中间件
使用express写接口
使用express写接口以及cors解决跨域
中间件cors需要在所有路由之前导入
使用jsonp解决跨域
MYSQL的基本使用
查询语法:
插入语法:
修改语法:
修改多个值使用英文逗号隔开
删除语法:
删除时一定要加上where的限定条件,否则整张表到会被删除
WHERE子句
ORDER BY子句排序
COUNT(*)统计函数
在项目中操作MYSQL
db.query()函数只能测试mysql是否能正常工作
mysql数据库表的设计
数据库一对一、一对多、多对多设计
数据库实体间有三种对应关系:一对一、一对多、多对多
一对一关系示例:
一个学生对应一个学生档案材料 每个人都有唯一的身份证号
一对多关系示例:
一个学生只属于一个班,但这个班有多名学生
多对多关系示例:
一个学生可以选择多门课,一门课也可以有多名学生
一个人可以有多个角色,一个角色可以有多个人
前后端的身份认证
身份认证
session认证机制
在express中使用session认证
JWT认证机制
在express中使用JWT
以下需要权限的接口,不是以/api开头
mysql给数据表字段设置默认值
// 给ev_article_cate的is_delete字段设置0的默认值
alter table `ev_article_cate` alter column is_delete set default '0';