Node.js是什么?
Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,用了一个事件驱动、非阻塞式I/O模型, [1] 让JavaScript 运行在服务端的开发平台。
vscode控制台运行nodemon server.js 报错:
nodemon : 无法加载文件 D:\node-v12.12.0-win-x64\nodemon.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execu tion_Policies。
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);
 
路由的使用
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';










