Node基础

219 阅读6分钟

本文根据jsliang Node - 从0基础到实战企业官网 练习所写,文章太好了实力推荐!!

1.http

01_http.js

    //1.引入http模块
    let http = require("http");
    // 2.http创建服务
    /**
     * req 获取 url 信息 (request)
     * res 浏览器返回响应信息 (response)
     */
    http.createServer((req,res) =>{
        // 设置 HTTP 头部,状态码是 200,文件类型是 html,字符集是 utf8
        res.writeHeade(200,{
            "Content-Type": "text/html;charset=UTF-8"
        });
        //往页面打印值
        res.write('<h3>hello NodeJS</h3>');
        //结束响应
        res.end();
        
    }).listen(7777);//监听端口7777
执行上面代码: 终端输入node 01_http.js  
在浏览器输入localhost:7777

2.URL模块

02_url.js

    // 引入http模块
    let http = require('http');
    // 引入URL模块
    let url = require('url');
    /**
     http创建服务
     * req 获取 url 信息 (request)
     * res 浏览器返回响应信息 (response)
    */
    http.createServer((req,res)=>{
          // 访问地址是:http://localhost:7777/?userName=wang&userAge=23
          // console.log(req.url)会执行两次
          //   /?userName=wang&userAge=23
          //   /favicon.ico
          // 这里为了防止重复执行,所以排除 req.url == /favicon.ico 的情况
          if(req.url != '/favicon.ico'){
            //使用 url 的 parse 方法
            /**
              * parse 方法需要两个参数:
              * 第一个参数是地址
              * 第二个参数是 true 的话表示把 get 传值转换成对象
            */ 
            var result = url.parse(req.url,true);
            console.log(result);
            /**
                * Url {
                *   protocol: null,
                *   slashes: null,
                *   auth: null,
                *   host: null,
                *   port: null,
                *   hostname: null,
                *   hash: null,
                *   search: '?userName=wang&userAge=23',
                *   query: { userName: 'wang', userAge: '23' },
                *   pathname: '/',
                *   path: '/?userName=wang&userAge=23',
                *   href: '/?userName=wang&userAge=23' }
            */
            // console.log(result.query.userName);//wang
          }
          
          // 设置 HTTP 头部,状态码是 200,文件类型是 html,字符集是 utf8
          res.writeHead(200, {
            "Content-Type": "text/html;charset=UTF-8"
          });
          // 往页面打印值
          res.write('<h1 style="text-align:center">Hello NodeJS</h1>');
          // 结束响应
          res.end();
    }).listen(7777);

3. fs文件管理

03_fs.js

1. fs.stat 检查一个读取的是文件还是目录

    // 引入fs文件模块
    let fs = require("fs");
    fs.stat('./01_http.js',(error, stats) => {
        if(error){
            console.log(error);
            return;
        }else{
            console.log(stats);
            // {
            //     dev: 16777221,
            //     mode: 33188,
            //     nlink: 1,
            //     uid: 501,
            //     gid: 20,
            //     rdev: 0,
            //     blksize: 4096,
            //     ino: 11158405,
            //     size: 487,
            //     blocks: 8,
            //     atimeMs: 1574065372034.9368,
            //     mtimeMs: 1574065370870.2712,
            //     ctimeMs: 1574065370870.2712,
            //     birthtimeMs: 1574060335297.9758,
            //     atime: 2019-11-18T08:22:52.035Z,
            //     mtime: 2019-11-18T08:22:50.870Z,
            //     ctime: 2019-11-18T08:22:50.870Z,
            //     birthtime: 2019-11-18T06:58:55.298Z }
            console.log(`文件:${stats.isFile()}`); 
            // Console:文件:true
            console.log(`目录:${stats.isDirectory()}`); 
            // Console:目录:false
            return;
        }
        
    })

2. fs.mkdir 创建目录

    fs.mkdir('css',(error)=>{
        if(error){
            console.log(error);
            return;
        }else{
            console.log('创建css目录成功');
        }
    });

3.rmdir 删除文件

    fs.rmdir('css',(error)=>{
        if(error){
            console.log(error);
            return;
        }else{
            console.log('删除css目录成功');
        }
    })

4.writeFile 写入 : 存在即覆盖,不存在即创建

    fs.writeFile('index.js','wang',(error)=>{
         if(error){
            console.log(error);
            return;
        }else{
            console.log('写入indexJS成功');
        }
    })

5.appendFile 追加内容

    fs.appendFile('index.js','追加内容试试',(error)=>{
         if(error){
            console.log(error);
            return;
        }else{
            console.log('追加indexJS成功');
        }
    })

6.readFile/readdir 读取文件和读取目录

    fs.readFile('index.js',(err,data) =>{
        if(err){
            console.log(err);
            return false;
        }else{
            console.log('读取文件成功');
            console.log(data);
        }
    })
    
    fs.readdir('node_modules', (err, data) => {
        if(err) {
          console.log(err);
          return false;
        } else {
          console.log("读取目录成功!");
          console.log(data);
          // Console:
          // 读取目录成功!
          // [ '03_tool-multiply.js', 'wang-module' ]
        }
      })

7.rename 重命名

    fs.rename('index.js','wang.js',(error)=>{
         if(error){
            console.log(error);
            return false;
        }else{
            console.log('index.js重命名为wang.js成功');
        }
    });
    //rename 也有剪切的功能
    //将wang.js 剪切至node_modules目录下
    fs.rename('wang.js','node_modules/wang.js',(error) =>{
        if(err) {
            console.log(err);
            return false;
          } else {
            console.log("剪切成功!");
          }
    })

4. fs流

1. 读取流

    const fs = require('fs');
    // 流的方式读取文件
    let fileReadStream = fs.createReadStream('wang.js');
    //保存数据
    let str = '';
    // 开始读取
    fileReadStream.on('data',(chunk)=>{
        console.log(chunk);
        str += chunk;
    });
    //读取完成
    fileReadStream.on('end',()=>{
        console.log("——结束——");
        console.log(str);//wang追加内容试试(wang.js内容)
    });
    // 读取失败
    fileReadStream.on('error', (error) => {
        console.log(error);
    })

2. 写入流

    const fs = require('fs');
    let data = 'console.log("Hello World! 我要存入数据!")';
    // 创建一个写入流  写入到wang.js中;
    let writeStream = fs.createWriteStream('wang.js');
    //开始写入
    writeStream.write(data,'utf8');
    //写入完成
    writeStream.end();
    writeStream.on('finish',()=>{
        console.log('写入完成');
    });
    
    // wang.js 内容变成了: console.log("Hello World! 我要存入数据!")

5. MySQl

安装Node连接MySQL的包

    npm i mysql -D 

index.js

    let mysql = require("mysql");
    //mysql 连接信息
    let connection = mysql.mysql.createConnection({
         host: 'localhost',
         user: 'root',
         password: '123456',//mysql数据库的密码
         database: 'demoSql'//当前连接的数据库
    });
    // 开始连接
    connection.connect();
    //查询user表的数据
    connection.query('SELECT * FROM user',(error, results)=>{
        if(error) throw error;
        console.log(results);
        /* [ RowDataPacket { id: 1, name: 'wang', age: 24 },
        RowDataPacket { id: 2, name: 'lu', age: 29 } ] */
    });
    //终止连接
    connection.end();

6. 实际建立前后台通讯

index.js

//连接mysql :先安装 npm i mysql -D
let mysql = require('mysql');

//mysql连接信息
let connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '123456',
    database: 'demoSql'
});
//开始连接
connection.connect();

// 引入http模块:http是提供web服务的基础
const http = require('http');
// 引入 url 模块:url 是对用户提交的路径进行解析
const url = require('url');
// 引入 qs 模块:qs 是对路径进行 json 化或者将 json 转换为 string 路径
const qs = require("querystring");
// 用 http 模块创建服务
/**
 * req 获取 url 信息 (request)
 * res 浏览器返回响应信息 (response)
 */
http.createServer((req,res) => {
    //设置cors跨域
    res.setHeader('Access-Control-Allow-Origin','*');
    //设置header类型
    res.setHeader("Access-Control-Allow-Headers",'Content-Type');
    //跨域允许的请求方式
    res.setHeader("Content-Type",'application/json');

    switch(req.method){
        case 'OPTIONS':
            res.statusCode = 200;
            res.end();
            break;
        case 'POST':
            console.log('post方式');
            //获取前端发来的路由地址;
            let pathName = req.url;
            // 接收发送过来的参数
            let tempResult = "";
            req.on('data',(data) =>{
                tempResult+=data;//tempResult =  username=admin&password=admin
            });
            req.on('end',() =>{
                let result = JSON.stringify(qs.parse(tempResult));//{"username":"admin","password":"admin"}

                if (pathName == "/sendMessage") { // 提交留言信息

                    console.log("\n【API - 提交留言信息】");
        
                } else if (pathName == "/login") { // 登录
                    
                    console.log("\n【API - 登录】");
        
                } else if (pathName == "/register") { // 注册
                    console.log("\n【API - 注册】");
                    result = JSON.parse(result);
                    let username = result.username; // 用户名
                    let password = result.password; // 密码
                    let time = getNowFormatDate(); // 时间
                    if (!username) { // 用户名为空
                        res.end("注册失败,用户名为空。");
                        return;
                    } else if (!password) { // 密码为空
                        res.end("注册失败,密码为空!");
                        return;
                    } else{
                        console.log('sql')
                        //查询user表,是否存在已注册过的数据
                        //使用Promise的原因:是调用了两次数据库,数据库的查询是异步的,需要在查询无重复数据完成后往数据库添加此条数据;
                      new Promise((resolve,reject) =>{
                            let searchSql = 'SELECT * FROM user';
                            connection.query(searchSql,(err,reponse)=>{
                                if(err){//mysql错误
                                    throw error;
                                }else{
                                    console.log("\nSQL 查询结果:");
                                    // console.log(reponse);
                                    // [RowDataPacket{id:0,name:'',user_name:''..},RowDataPacket{id:0,name:'',user_name:''..}]
                                    
                                    // 将结果先去掉 RowDataPacket,再转换为 json 对象
                                    let newRes = JSON.parse(JSON.stringify(reponse));
                                    // console.log(newRes);//[{id:0,..},{id:1...}]
                                    let flag = false;//判断是否存在重复名称;
                                    for(let item in newRes){
                                        if(newRes[item].user_name == username){
                                            flag = true;
                                        }
                                    }
                                    //如果username重复
                                    if(flag){
                                        res.write(JSON.stringify({
                                            code: "500",
                                            message: "注册失败,姓名重复!"
                                        }));
                                        res.end();
                                        return;
                                    }else{
                                        resolve();//可以注册,执行then()
                                    }
                                }
                            })
                      }).then(() =>{
                        //第二步
                        //新增sql字段信息
                        let addSql = 'INSERT INTO user(user_name,user_password,time) VALUES (?,?,?)';
                        let addSqlParams = [result.username, result.password, time];
                        connection.query(addSql,addSqlParams,(error2,response2) =>{
                            if(error2){
                                throw error2;
                            }else{
                                console.log('sql新增成功')
                                console.log(response2);
                                 // 接口返回数据
                                res.write(JSON.stringify({
                                    code: "0",
                                    message: "注册成功!"
                                }));
                                //结束响应
                                res.end();
                            }
                        })
                       
                      })
                    }
                }
               
            })
            break;
        case 'GET':
            console.log('get方式')
            break;
    }
}).listen(7777);

// 获取当前时间
function getNowFormatDate() {
    var date = new Date();
    var year = date.getFullYear(); // 年
    var month = date.getMonth() + 1; // 月
    var strDate = date.getDate(); // 日
    var hour = date.getHours(); // 时
    var minute = date.getMinutes(); // 分
    var second = date.getMinutes(); // 秒
    if (month >= 1 && month <= 9) {
      month = "0" + month;
    }
    if (strDate >= 0 && strDate <= 9) {
      strDate = "0" + strDate;
    }
    // 返回 yyyy-mm-dd hh:mm:ss 形式
    var currentdate = year + "-" + month + "-" + strDate + " " + hour + ":" + minute + ":" + second;
    return currentdate;
  }
  

index.html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>演示代码</title>
</head>

<body>
  <div>
    <label for="user">用户名</label><input type="text" id="user">
  </div>
  <div>
    <label for="password">密&nbsp;&nbsp;&nbsp;码</label><input type="password" id="password">
  </div>
  <div>
    <button id="register">注册</button>
  </div>

  <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
  <script>
    $(function () {
      // 测试 get 接口
    //   $.ajax({
    //     url: "http://localhost:8888/getMessage",
    //     type: "POST",
    //     data: {
    //       username: "jsliang"
    //     },
    //     success: function (res) {
    //       console.log(res);
    //     },
    //     error: function (err) {
    //       console.log(err);
    //     }
    //   })

      $("#register").click(function () {
        // 测试 post 接口
        $.ajax({
          url: "http://localhost:7777/register",
          type: "POST",
          data: {
            username: $("#user").val(),
            password: $("#password").val()
          },
          success: function (res) {
            alert(res.message);
          },
          error: function (err) {
            console.log(err);
            alert(err.message);
          }
        })
      })
    });
  </script>
</body>

</html>

神奇!!!