ECMASCRIPT(声明JS变量、判断、循环等语法)
DOM(文档document)
BOM(window、location等)
· ECMAScript 语法:变量、判断、循环
· 内置核心模块: http服务,fs文件操作,url路径,path路径,os操作系统
· 第三方模块
·自定义模块:自己创建的js文件
· 一个文件就是一个模块
·通过exports和modul.export来到处模块中的成员(声明模块中哪些功能可以使用)
·通过require来加载模块(导出几个可以用几个)
// 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();
https://github.com/nodejs/node/tree/master/lib
OS | Node.js v14.17.3 Documentation (nodejs.org)
var os = require("os");
OS | Node.js v14.17.3 Documentation (nodejs.org)
var path = require('path');
// 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
var url = require('url');
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);
// 引入对象 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); })
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'); })
req.headers 获取请求头信息(对象)
req.rawHeaders 获取请求头信息(数组)
req.httpVersion 获取HTTP版本
req.method 获取请求方法
req.url 获取请求路径(不含网址)
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()
命令行工具
英文node package manager的缩写
下载node所需的第三方模块
命令行 npm -v,下载nodejs自带
查看:npm list
安装:npm install 模块/模块@版本号(安装可选参数)
卸载:npm uninstall 模块
只安装生产环境: npm install —production
都安装: npm install
–save 记录生产环境所需模块(默认)
–save-dev 记录开发环境所需模块
-g 该模块科长命令行运行(global全局)
-g安装在全局目录下,其他都安装在当前目录下,npm config list 可以查看全局目录所在位置
默认install不加参数则属于生成环境模块
安装模块加–production参数则生产环境,否则都安全
安装mime模块(帮助用户判断文件mime类型)
初始化项目
安装/卸载模块
通过npm命令下载会到国外服务器获取
缺点:下载速度慢
可以切换到国内服务器
nrm是资源管理工具,可以切换到国内服务器下载
安装:npm install nrm -g
查看: nrm ls
切换:nrm use 服务器名
测速:nrm test npm
通过修改package.json文件的scri自定义脚本命令
语法:npm run 名称
模块:在node中就是一个文件
包: n个模块、目录、package.json等组成,发布后别人可以require
npm install nodemon --save-dev -g
当修改js文件时,不需要重新启动,保存后就会自动重启
npm install moment
var moment = require('moment'); moment().format('日期格式'); // YYYY-MM-D h:mm:ss
Moment.js 中文网 (momentjs.cn)
这里可以查找你想要的日期格式
介绍:基于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("启动成功"); })
默认通过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...') })
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参数的
安装: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模块: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 入门教程 - 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
类似于数组,成员唯一
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
键不限于字符串(传统方式对象的键一定是字符串),可以是数组或其他
语法:
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)
用于不确定参数数量的情况下
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参数更加灵活
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
通过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');
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()
异步编程的一种解决方案,防止回调地狱
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("喵~"); } }
npm install mysql
//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();