Nodejs 学习笔记

2021/7/10 17:36:39

本文主要是介绍Nodejs 学习笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Nodejs学习笔记

  • 简介、安装、常用模块、留言板
      • JS三大组成部分:
    • 模块(http服务器等)
      • CommonJS模块规范
      • 自定义Node.js模块
        • 语法
      • 内置Node.js模块
    • 模块系统
      • 获取操作系统信息(os模块) (了解即可)
        • 1.文档
        • 2.引入
      • 路径处理(path模块)
        • 1.文档
        • 2.引入
        • 3.练习
      • 网址处理(url模块)
        • 1.文档
        • 2. 引入
        • 3.练习
      • 文件系统(fs模块)
        • 语法
        • 练习
      • 构建http服务器(http模块)
        • 练习
    • 请求和响应对象
        • 语法
            • 请求对象(request)
            • 响应对象(response)
  • NPM使用、模板引擎、Express框架
      • NPM简介
        • 是什么
        • 作用
        • 查看
      • NPM语法
        • 命令
        • 安装参数
      • 使用
        • NPM源管理
      • NPM自定义脚本命令
      • NPM包自定义发布
      • nodemon自动重启服务(第三方模块)
        • 安装
        • 作用
      • moment 日期模块
        • 安装
        • 语法
        • 网址
      • Jade/ejs/art 模块引擎
      • Express
          • 安装
          • 用法
        • art
          • 文档
          • 安装
          • 测试
        • 路由
          • 语法
        • 利用 Express 托管静态文件
      • 中间件
        • 中间件执行
      • 会话技术
        • cookie
        • session
  • ES6语法
        • 文档
      • Set和Map 数据结构
        • Set
          • 语法:
        • Map
      • 遍历
      • 函数
        • 参数的默认值
        • 箭头函数
        • rest参数
      • 字符串拓展
        • repeat函数
        • 模板字符串
      • 模块(module)
      • class类
  • Promise对象
          • 语法
      • 对象简写
  • nodejs控制数据库
      • 1. 安装模块
      • 2. 语法

简介、安装、常用模块、留言板

JS三大组成部分:

ECMASCRIPT(声明JS变量、判断、循环等语法)

DOM(文档document)

BOM(window、location等)

模块(http服务器等)

· ECMAScript 语法:变量、判断、循环

· 内置核心模块: http服务,fs文件操作,url路径,path路径,os操作系统

· 第三方模块

·自定义模块:自己创建的js文件

CommonJS模块规范

· 一个文件就是一个模块

·通过exports和modul.export来到处模块中的成员(声明模块中哪些功能可以使用)

·通过require来加载模块(导出几个可以用几个)

自定义Node.js模块

语法

// 1.导出成员(声明模块、文件中哪些方法可以被外部使用)
// 写法1
exports.属性/方法名 = 功能
// 写法2
module.exports.属性/方法名 = 变量名

// 2.外部引入使用
var 对象 = require('路径及文件名');
对象.属性/方法名;

练习:

创建a.js和b.js 文件,在a.js 引入 b.js模块

b.js

// 1.定义
function b1() {
    console.log('我是b1');
}
function b2() {
    console.log('我是b2');
}
function b3() {
    console.log('我是b3');
}
function b4() {
    console.log('我是b4');
}
// 导出exports
exports.b1 = b1;
exports.b2 = b2;
exports.b3 = b3;
exports.b4 = b4;
// module.exports = exports

a.js

// 引入自定义模块
var b = require('./b'); // .js不用写

console.log(b);
b.b1();
b.b2();

内置Node.js模块

https://github.com/nodejs/node/tree/master/lib

模块系统

获取操作系统信息(os模块) (了解即可)

1.文档

OS | Node.js v14.17.3 Documentation (nodejs.org)

2.引入

var os = require("os");

路径处理(path模块)

1.文档

OS | Node.js v14.17.3 Documentation (nodejs.org)

2.引入

var path = require('path');

3.练习

// dirname 后去一层
// basename 取最后一层
var path = require('path');

var testData = 'E:/nodejs/add.htm';
console.log(path.basename(testData)); // add.htm
console.log(path.dirname(testData)); // E:/nodejs

网址处理(url模块)

1.文档

2. 引入

var url = require('url');

3.练习

var url = require('url');

var data = 'http://itcast.cn?name=小红&age=18';

console.log(data);
console.log(url.parse(data));

// 获取参数
var urlQueryObj = url.parse(data,true);
console.log(urlQueryObj.query); //{name: '小红',age: '18'}
console.log(urlQueryObj.query.name);
console.log(urlQueryObj.query.age);

文件系统(fs模块)

语法

// 引入对象
var fs = require('fs');

// 调用函数写数据入文件
fs.writeFile(路径及文件名,数据,function(err) {
             err 为null -- 写入成功
             err不为null -- 写入失败
             });

练习

通过write.js 文件创建a.txt 写入你好,中国

var fs = require('fs');

fs.writeFile('./a.txt', '你好,中国', function(err) {
    if(err) {
        console.log(err);
        return;
    }
    console.log('success');
})

通过read.js 文件来读取a.txt内容

var fs = require('fs');
// 1.
fs.readFile('a.txt',function(err,data) {
    if(err) {
        console.log(err);
        return;
    }
    console.log(data); // Buffer对象
    console.log(data.toString()); // Buffer.toString()转换为字符
})
// 2. 前期声明
fs.readFile('a.txt','utf8',function(err,data) {
    if(err) {
        console.log(err);
        return;
    }
    console.log(data);
})

构建http服务器(http模块)

练习

var http = require('http');
// 创建web服务器
var server = http.createServer();
// 监听请求
server.on('request',function(req,res) {
    console.log('收到用户请求,请求地址:' +req.url ); // 抓取请求地址
    // 有请求必须有响应,没有响应网页无法打开
    res.write('hello');
    res.end();
})
// 启动服务
server.listen(8080,function() {
    console.log('启动成功,访问 http://localhost:8080');
})

注意,用户通过浏览器访问html文件可能会发送n次请求,因为除html需要请求外,css、js、网站图标等也需要发送http请求。

当判断用户访问的页面,响应不同数据时

var http = require('http');
// 创建web服务器
var server = http.createServer();
// 监听请求
server.on('request',function(req,res) {
    console.log('收到用户请求,请求地址:' +req.url ); // 抓取请求地址
    // 判断请求的地址
    if(req.url == '/') {
        $msg = 'this is index'
    } else if (req.url == '/login') {
        $msg = 'this is login'
    } else {
        $msg = '404'
    }
    res.setHeader('Content-Type','text/html;charst=utf-8'); // 去掉这行试试
    // 有请求必须有响应,没有响应网页无法打开
    res.write($msg);
    res.end();
})
// 启动服务
server.listen(8080,function() {
    console.log('启动成功,访问 http://localhost:8080');
})

请求和响应对象

语法

请求对象(request)

req.headers 获取请求头信息(对象)

req.rawHeaders 获取请求头信息(数组)

req.httpVersion 获取HTTP版本

req.method 获取请求方法

req.url 获取请求路径(不含网址)

响应对象(response)
res.statusCode = 404;
res.statusMessage = 'Not Found';
res.setHeader('Content-Type','text/html;charst=utf-8');

// 简化版
res.writeHeader(404, 'Not Found', {
    'Content-Type':'text/html;charst=utf-8'
})

res.write(数据)
res.end()

NPM使用、模板引擎、Express框架

NPM简介

是什么

命令行工具

英文node package manager的缩写

作用

下载node所需的第三方模块

查看

命令行 npm -v,下载nodejs自带

NPM语法

命令

查看:npm list

安装:npm install 模块/模块@版本号(安装可选参数)

卸载:npm uninstall 模块

只安装生产环境: npm install —production

都安装: npm install

安装参数

–save 记录生产环境所需模块(默认)

–save-dev 记录开发环境所需模块

-g 该模块科长命令行运行(global全局)

-g安装在全局目录下,其他都安装在当前目录下,npm config list 可以查看全局目录所在位置

默认install不加参数则属于生成环境模块

安装模块加–production参数则生产环境,否则都安全

使用

安装mime模块(帮助用户判断文件mime类型)

  1. 初始化项目

  2. 安装/卸载模块

NPM源管理

通过npm命令下载会到国外服务器获取

缺点:下载速度慢

可以切换到国内服务器

nrm是资源管理工具,可以切换到国内服务器下载

安装:npm install nrm -g

查看: nrm ls

切换:nrm use 服务器名

测速:nrm test npm

NPM自定义脚本命令

通过修改package.json文件的scri自定义脚本命令

语法:npm run 名称

NPM包自定义发布

模块:在node中就是一个文件

包: n个模块、目录、package.json等组成,发布后别人可以require

nodemon自动重启服务(第三方模块)

安装

npm install nodemon --save-dev -g

作用

当修改js文件时,不需要重新启动,保存后就会自动重启

moment 日期模块

安装

npm install moment

语法

var moment = require('moment');
moment().format('日期格式'); // YYYY-MM-D h:mm:ss

网址

Moment.js 中文网 (momentjs.cn)

这里可以查找你想要的日期格式

Jade/ejs/art 模块引擎

Express

介绍:基于nodejs开发的一个框架,可以加快项目开发,便于团队协作

安装

npm install express

用法
var express = require('express')
// 创建web服务器
var app = express()
// 路由
app.get('/', function(req,res) {
    // end()     响应字符串(乱码)
    //send()     响应字符串(自动识别)
    // render()  响应字符串(自动识别,只能打开指定文件字符串并响应,必须配合模板引擎使用
    res.send("欢迎光临")
})
// 启动服务
app.listen(8080, function() {
    console.log("启动成功");
})

art

默认通过end或send渲染,无法加载视图,所以得自己配置默认模板引擎

文档

介绍 - art-template (aui.github.io)

安装

npm install art-template

npm install express-art-template

测试
//1.引入第三方模块ART
var art = require('art-template');

//2.调用render方法,将字符串替换成HTML
// var html = '<h1>{{username}}</h1>';
// var result = art.render(html, {username: '张三'});
// console.log(result);


//2.调用art(同renderFile),将字符串替换成HTML
var html = art(__dirname + '/art.html', {
	username: '小红',
	money: 5,
	orders: [
		{id:1, title: '流口水', price: 30},
		{id:2, title: '棒棒糖', price: 33},
		{id:3, title: '冰淇淋', price: 12},
	], 
});
console.log(html);
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	 <div>{{username}}</div>
	 <div>{{money}}</div>
	 <div>
	 	{{if money > 18}}
			欢迎光临~
		{{else}}
			你走吧
		{{/if}}
	 </div>
	 <div>
	 	{{each orders as order index}}
		    {{index}} {{order.title}}
		{{/each}}
	 </div>
</body>
</html>

路由

路由就是网址,路由参数就是网址参数,在nodejs中,路由作用是交给指定匿名函数处理。

语法

http请求类型有get,post,put,delete等。

普通语法:app.http请求类型(请求路径,回调函数)

特殊语法:app.use(请求路径,回调函数)

use匹配任意类型请求,但并非完全匹配,只需要url前面匹配请求路径即可

**路由参数:**app.HTTP请求类型(请求路径/:参数1/…/:参数n,回调函数)

测试特殊语法

var express = require('express')
var app = express()
//3.路由
app.get('/',  function(req, res) {
	var formHtml = `
		<form action="/test/a/b/c" method="post">
			<input type="text" name="uname" />
			<input type="text" name="age" />
			<input type="submit"  />
		</form>
	`
	res.send(formHtml)
})

app.use('/test', function(req, res){
	res.send('this is /test')
})

//4.启动服务
app.listen(8080, function(){
	console.log('Running...')
})

测试路由参数

var express = require('express')
//2.创建框架核心app对象
var app = express()
//3.路由
app.get('/cat/:name/:age', function(req, res){
	console.log(req.params);
	res.send('匹配成功')
})
//4.启动服务 
app.listen(8080, function(){
	console.log('Running...')
})

利用 Express 托管静态文件

var express = require('express')
var fs = require('fs')
//2.创建框架核心app对象
var app = express()
//3.路由
// 响应指定静态资源,不用express框架
// app.get('/public/css/a.css', function(req, res){
// 	fs.readFile('./public/css/a.css','utf8',function(err,data){
//         if(err)res.send(err);
//         res.send(data)
//     })
// })
// 响应多个静态资源,使用express框架
app.use('/public', express.static('public'))
//4.启动服务 
app.listen(8080, function(){
	console.log('Running...')
})

中间件

概念:HTTP请求中的过滤层(HTTP请求交给方法处理前,先交给另一个方法过滤)

应用场景:判断登录状态、检测RBAC权限、错误捕捉等

中间件执行

app.use('/', function() {
    // 逻辑代码
    
    // 默认路由匹配成功不会向后走,但是加next会继续向下匹配
    next()
})
var express = require('express')
var app = express();
app.use('/',function(req,res){
    console.log(1);
    next()
})
app.get('/a',function(req,res) {
    console.log('hi');
    res.send('hi')
})
app.get('/a/b',function(req,res) {
    console.log('hello');
    res.send('hello')
})
app.listen(8080,function() {
    console.log('启动成功');
})

next不加参数则交给下面第一个匹配成功的

next加参数则交个下面第一个有err参数的

会话技术

cookie

安装:npm install cookie-parser

引入:var cookieParser = require(‘cookie-parser’)

初始化:app.use(cookieParser())

语法:res.cookie(键, 值, {signed: 是否加密true-是,false-否默认,maxAge: 时间/毫秒})

var express = require('express')
var cookieParser = require('cookie-parser')
var app = express();
// 配置
app.use(cookieParser('cat'))
app.get('/set',function(req,res) {
    res.cookie('a',1) // 永久
    res.cookie('b',2) 
    res.cookie('c',3,{signed:true})// 加密
    res.cookie('d',4,{maxAge: 60*1000})// 1min
    res.send('设置成功')
})
app.get('/get',function(req,res) {
    // 获取(未加密):req.cookies
    // 获取 (加密)  :req.signedCookies
    console.log(req.cookies.a);
    console.log(req.cookies.b);
    console.log(req.signedCookies.c);
    console.log(req.cookies.d);
})
app.get('/del',function(req,res) {
    res.clearCookie('b')
})

app.listen(8080,function() {
    console.log('启动成功');
})

session

安装session模块:npm install express-session

引入session模块:var session = require(‘express-session’)

设置:req.session.键 = 值

获取:req.session.键

清除:req.session.键 = null

var express = require('express')
var session = require('express-session')
var app = express();
// 配置
app.use(session({
    secret: 'itcast',	  	  	//加密存储
    resave: false,			//客户端并行请求是否覆盖:true-是,false-否
    saveUninitialized: true   //初始化session存储
  }))
  // 路由
app.get('/set',function(req,res) {
    req.session.a = 1
	req.session.b = 2
	req.session.c = 3
	res.send('设置成功')
})
app.get('/get',function(req,res) {
    console.log(req.session.a)
	console.log(req.session.b)
	console.log(req.session.c)
})
app.get('/del',function(req,res) {
    req.session.c = null
	res.send('删除成功')
})

app.listen(8080,function() {
    console.log('启动成功');
})

ES6语法

文档

ES6 入门教程 - ECMAScript 6入门 (ruanyifeng.com)

新Symbol数据类型

声明独一无二的值

    //没有参数
	var str1 = Symbol()
	var str2 = Symbol()
	console.log(str1 === str2)  //false
	//有参数
	var str3 = Symbol("itcast")
	var str4 = Symbol("itcast")
	console.log(str3 === str4)  //false

Set和Map 数据结构

Set

类似于数组,成员唯一

语法:
var set = new Set([1,2,3])
        console.log(set.size); //3
        set.add(4);
        console.log(set.size); // 4
        set.clear();
        console.log(set.size); // 0

        // 去重
        var arr = [...new Set([1,2,3,4,3,2,1])]
        console.log(arr); // 1,2,3,4

Map

键不限于字符串(传统方式对象的键一定是字符串),可以是数组或其他

语法:

var map = new Map;
        map.set('a',111)
        console.log(map.get('a'));
        // 键是数组
        var t = ['b'];
        map.set(t,2)
        console.log(map.get(t)); // 2
        // 获取所有键值
        console.log(map.keys()); 
        // 获取所有值
        console.log(map.values());

遍历

for…of,可以遍历数组、字符串、映射、集合等数据结构

var arr = [1,2,3]
        for(var val of arr) {
            console.log('值:', val);
        }
        var set = new Set([1,2,3,4,5])
        for (var val of set) {
            console.log('值:', val);
        }

函数

参数的默认值

function f(name = "布偶", age = 1){
            console.log('name:',name,'age:',age);
        }
        f() // name: 布偶 age: 1
        f("缅因") // name: 缅因 age: 1
        f("加菲",2) // name: 加菲 age: 2

箭头函数

简化函数,敲代码更简洁

var f1 = () => console.log(1);
        var f2 = name => console.log(2);
        var f3 = (name,age) => console.log(3);

        f1();
        f2(11)
        f3(11,22)

rest参数

用于不确定参数数量的情况下

function f (...m) {
            console.log(m);
        }
        f(1,2,3,4)
        function f1 (a,...b) {
            console.log(a); // 1
            console.log(b); // 2,3,4
        }
        f1(1,2,3,4)

相比arguments,rest参数更加灵活

字符串拓展

repeat函数

var arr = 'cat'
        console.log(arr.repeat(3)); // catcatcat

模板字符串

var name = "布偶"
        var age = 2
        var html = `
          <ul>
            <li>${name}</li>
            <li>${age}</li>
          </ul>
        `
        console.log(html);
        document.getElementById('test').innerHTML = html

模块(module)

通过import 和export实现导入导出功能(必须走http协议访问,及将文件放在apache站点目录下运行)

导出:

var name = '布偶'
var age = 1
function f() {
    console.log("喵~");
}
export {name,age,f}

导入:

import {name,age,f} from './export.js'
        console.log(name);
        console.log(age);
        f();

当只导出一个数据时,可以不加大括号

导出:

export default (name) => {
    console.log(name);
}

导入:

import aa from './export.js'
        aa('a');

class类

JS中的成员只有公有的、私有的两种形式,但是不能直接通过public、private关键字来修饰。

用this来声明公有属性

用var来声明私有属性

 class cat {
            constructor(name,age) {
                // this 为公有,var为私有
                this.name = name
                this.age = age
            }
            say() {
                console.log("喵~");
            }
        }
        var c = new cat('布偶',2)
        console.log(c);
        console.log(c.name);
        console.log(c.age);
        c.say()

Promise对象

异步编程的一种解决方案,防止回调地狱

语法

resolve [rɪˈzɑ:lv] 数据处理完成

reject [rɪˈdʒɛkt] 数据处理出错

var p1 = new Promise(function (resolve, reject) {
    //1.异步处理代码
    //2.判断异步结果
    if (操作成功) {
      resolve(data) //数据处理完成
    } else {
      reject(err)   //数据处理出错
    }
})
var p2 = new Promise(....)
var p3 = new Promise(....)

...

p1
  .then(function (data) {
    console.log('操作成功,数据:' + data)
    return p2;	 						 //相当于将p2的代码拿过来执行,然后继续调用方法
  }, function (err) {
    console.log('操作失败,错误:' + err)
  })
  .then(function (data) {
    console.log('操作成功,数据:' + data)
    return p3;							 //相当于将p3的代码拿过来执行,然后继续调用方法
  })
  .then(function (data) {
    console.log('操作成功,数据:' + data)
    return p4;							 //相当于将p4的代码拿过来执行,然后继续调用方法
  })

对象简写

var cat = {
            name:"布偶",
            age:1,
            say() {
                console.log("喵~");
            }
        }

nodejs控制数据库

1. 安装模块

npm install mysql

2. 语法

//1.引用mysql模块
var mysql = require('mysql');
//2.创建连接账号
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '12345678',
  database : 'nodejs'
});
 //3.连接
connection.connect();
 //4.发送SQL语句,增
connection.query("insert into cat values ('布偶', 1, '公')", function (error, results, fields) {
  if (error) throw error; //JS语法抛出异常
  console.log('The solution is: ', results);
});
// 删
connection.query("delete from cat where name = '布偶'", function (error, results, fields) {
    if (error) throw error; //JS语法抛出异常
    console.log('The solution is: ', results);
  });
// 改
connection.query("update cat set name = '缅因' where age = 3", function (error, results, fields) {
    if (error) throw error; //JS语法抛出异常
    console.log('The solution is: ', results);
  });
// 查
connection.query("select * from cat", function (error, results, fields) {
    if (error) throw error; //JS语法抛出异常
    console.log('The solution is: ', results);
  });
//5.关闭连接
connection.end();


这篇关于Nodejs 学习笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程