node.js入门笔记(超详细)

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);

路由的使用

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';
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值