node 模块化
闭包+自执行函数实现模块化
var 模块名 = (function(){
....
return {
变量1,
变量2
}
})(引入其他的模块名...)
ES6模块化
export 变量的声明赋值
import {变量名} from “模块路径”
默认导出
一个模块只能有一个默认导出,对于默认导出,导入的名称可以和导出的名称可以不一样。
commonJS模块化
//导出
module.exports={导出的变量}
exports.属性名 = value
//导入
let 变量名 = require(“模块路径”);
module.exports 和 exports的区别
1.exports可以多次导出,但是module.exports只能导出一次,多次导出最后一次生效。
2.exports和module.exports本质是相等的。exports是一个引用,指向的是module.exports
3.如果在同一个文件中使用两种导出,给exports添加的属性和方法,也会添加在module.exports上,但是添加在module.exports上的属性和方法,不会添加在exports上。
路径模块
为什么要使用路径模块?
因为不同操作系统下,分隔符是不一样。使用路径模块的path.join()会自动使用当前系统的分隔符进行拼接路径。
path.join 路径拼接
path.extname(文件路径) 获取文件的后缀名
__dirname 获取当前文件的绝对路径
node搭建服务器
// 引入http模块
const http = require("http");
// 调用http createServer方法创建服务
// 这个方法需要一个回调函数,回调函数中有两个形参 回调函数是在接收到请求时执行
// node 是依靠事件驱动。
// request 请求信息对象
// response 响应信息对象
http.createServer(function(req,res){
// 如果有请求进来,需要给它响应。
// 设置请求头,请求头中指定编码格式
res.setHeader("content-type","text/platin;charset=utf8")
res.end("你好,东湖");
// 需要添加端口监听
}).listen(3000);//不推荐更改,因为你不知道每个应用的端口。如果两个程序的端口冲突,则软件运行会出错。
console.log("服务器已经启动");
get 和 post 的区别
/*
* get 和 post 的区别
*
* 1.语义上的区别:
* get 获取 从服务器端获取一些数据时使用。
* post 发送 向服务器端发送一些数据。
* 2.参数
* get:参数会以键值对的形式拼接到地址栏中
* post:参数会在请求体中,发送到服务端。
*
* 参数的大小:
* get:4kb左右 会收浏览器URL长度的限制
* post:大小不受浏览器限制,但是可能会被服务器端限制。
*
* 3.安全性:
* post的安全性更高。
*
* 4.缓存
* get:请求会被浏览器缓存
* post:请求不会被浏览器缓存
*/
node获取get参数
通过req.url获取请求路径,使用?进行分隔得到一个数组,数组第二个元素就是get参数拼接的字符串。 引入querystring
模块,使用parse方法,将字符串解析为对象。
node获取post参数
通过事件监听的方式,监听data事件,也就是只要数据传入就会触发,在事件中使用字符串拼接的方式获取post请求的参数,再监听end事件,数据传输完毕时触发。在这个事件中对获取到的参数字符串进行解析(引入querystring
模块,使用parse方法)
package.json的作用
定义了这个项目需要哪些模块,以及该项目的配置信息(项目名,作者,版本,许可证等)
如何创建package.json
npm init 需要填写配置信息。
npm init -y 快速生成
模块加载机制
/**
* 模块加载机制
* 1.模块名有路径,并且有后缀
* 通过路径,引入相关的模块。
* 2.当模块有路径,但是没有后缀的时候
* 2.1 会先找路径下同名的js文件。
* 2.2 再找路径下同名的文件夹,找文件夹下的index.js
* 2.3 如果文件夹下有package.json 会找文件中的main字段 入口文件。
* 2.4 如果找不到,就报错。
* 3.模块没有路径也没有后缀。
* 3.1 node会判断它是否为内置模块,是内置就加载
* 3.2 不为内置,则去第三方模块中查找,去node_modules中查找。
*
*/
promise主要是为了解决什么问题
回调地狱:在处理异步函数的过程中,回调函数嵌套回调函数,多次嵌套后,造成回调地狱,代码十分难懂,复杂。
三种状态
pending:正在进行中
fulfilled 操作成功
rejected 操作失败
两个过程
pending -->rejected
pending -->fulfilled
async函数
使用:添加在普通函数定义前面,让其成为一个异步函数。或者成为async函数。
1.async函数返回的是一个Promise对象。
2.async函数内部return的值,就是then函数中回调函数的参数。
3.async函数内部如果有错误,会执行catch函数,catch函数中的回调函数的参数就是抛出的错误信息。
await关键字
await关键字只能在async函数中使用。
1.await命令后面一般是一个Promise对象。
2.await命令修饰Promise对象时,是等待该异步函数执行的结果。
执行顺序
1.先同步后异步
2.异步操作:定时器,事件绑定,回调函数。
3.promise的构造函数是同步执行。
在数据库中添加记录(insert)
insert into 表名(字段1,字段2...) values (值1,值2);
insert into 表名 values(值1,值2);
在数据库中删除记录(delete)
delete from 表名 [where 条件判断]
在数据库中修改数据(update)
update 表名 set 字段名=新值 [where 条件判断]
在数据库中查找数据(select)
select *[字段名1...] from 表名 [where 条件判断]
排序
select * from 表名 where 条件判断 order by 字段
多表查询
#左连接
select * from student s left join classinfo c on s.classId = c.id;
#右连接
select * from student s right join classinfo c on s.classId = c.id;
express实现路由
//1.引入express模块
const express = require("express");
//2.创建实例
let app = express();
app.请求方式("/请求路径",回调函数)
//3.监听端口
app.listen(3000);
模块化路由
//在路由文件中
var 路由名称 = express.Router();
module.exports = 路由名称;
//在app.js文件中
const 路由名称 = require("路由的路径");
//加载路由
app.use("路径",路由名称)
静态资源访问
app.use(express.static(path.join(__dirname,"public")))
原生Ajax使用步骤
let xhr = new XMLHttpRequest();
xhr.open("请求方式","请求路径")
xhr.send("post参数");
xhr.onreadystatechange = function () {
xhr.readystate==4 && xhr.status==200
}