Node系列一

173 阅读4分钟

一 、why

  1. 使自己更全面,有大局观
  2. 提升话语权
  3. 升职加薪的筹码

二、Node的作用和应用

  1. 脱离浏览器运行js
  2. 后台API的编写
  3. WebpackGulpNpm等等
  4. 中间层:服务器中负责IO读写的中间层服务器(性能好,适合高并发异步IO数据处理安全性好,隔离后台)

三、Node的优势

  1. 便于前端开发入门
  2. 性能高
  3. 利于前端代码整合

四、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

  1. 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
  1. 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查找规则

  1. 如果有路径,就去对应路径查找
  2. 如果没有就在node_modules里面查找
  3. 如果没有就在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