NodeJs—基础知识
一、NodeJs概述
基于谷歌的v8引擎(js解释器),运行在服务器端的语言,基于js的
对比js和nodejs
(1)js运行在浏览器端,存在多个浏览器,容易产生兼容性的问题;而nodejs在服务器端只有一个运营环境,不
存在兼容性。
(2)两者都有内置(es)对象,自定义对象,宿主对象(根据执行环境的不同来区分)
(3)JS用于网页中的交互效果,而nodejs用于服务器端的数据库操作、文件操作...
NodeJs的执行方式
(1)脚本模式 node c:/xampp/.../1.js;
交互模式
node
两次Ctrl+c 或者.exit 退出
二、全局对象
NODEJS:global
在交互模式下,声明的变量或者创建的函数都属于是全局对象下的,可以使用global访问,例如var a=1;global.a
在文件中,声明的变量或创建的函数都属于是局部作用域下的,不能使用global来访问。
JS:window
在浏览器下,文件中声明的变量或者创建的函数都属于是全局作用域下的,可以使用全局对象访问;例如 var a=1 window.a
1、console对象
global.console.log.(); //打印消息
global.console.info(); //打印消息
global.console.warn(); //打印警告消息
global.console.error(); //打印错误消息
global.console.time('自定义字符串'); //开始计时
global.console.timeEnd('自定义字符串'); //结束计时 自定义字符串前后要保持一致
2、process对象
查看当前计算机的进程
process.arch 查看当前CPU架构 x64
process.platform 查看当前的操作系统 win32
process.env 查看当前计算机的环境变量
process.version 查看当前node版本
process.pid 查看当前的进程编号
process.kill() 杀死某一个编号的进程
3、Buffer对象(内存有这个对象叫缓冲区)
缓冲区:在内存中存储数据的区域,存储网络传输时的资源
创建buffer
var buf=Buffer.alloc(5,‘abcde’) 第一个属性字节大小,第二个属性存储的数据
将buffer存储的数据转为普通字符
buf.toString();
4、全局函数 全局方法
parseInt/parseFloat/encodeURI/decodeURI/isNaN/isFinite/eval
4.1一次性定时器
开启
var timer=setTimeout(回调函数,间隔的时间(毫秒));
当间隔的时间到了,执行回调函数;单位是毫秒
清除
clearTimeout(timer);
4.1周期性定时器
开启
var timer=setInterval(回调函数,间隔的时间(毫秒));
当间隔的时间到了,执行回调函数;单位是毫秒
清除
clearInterval(timer);
4.2立即执行定时器
process.nextTike(回调函数);
在当前的事件循环的(2018年年底)结尾执行
var timer=setImmediate(回调函数)
clearImmediate(timer);
三、模块
模块可以理解为是一个功能体(积木块)
在nodejs下模块分为自定义模块、核心模块(官方提供)、第三方模块
在nodejs下任意一个文件都是一个模块,文件中的代码默认是被一个构造函数所包含。
以下代码中都是nodejs自动为文件添加的
(function(exports,require,module,__dirname,__filename){
//程序员编写的代码
})
__dirname 当前模块(文件)的完整路径
__filename 当前模块(文件)的完整路径和文件名称。
require() 引入一个模块
module 指代当前的模块对象
module.exports 当前模块的导出对象(公开),可以供其他的模块使用的属性和方法
exports 等价于module.exports
以路径开头 | 不以路径开头 | ||
---|---|---|---|
文件模块require(’./circle.js’) | 常用于用户自定义的模块, 如果后缀名是.js可以省略后缀名。 | requier(‘querystring’) | 常用于引入官方提供的核心模块 |
目录模块require(’./02_2’) | //引入目录 | require(‘04_2’) | 要求引入的目录放在node_modules中 |
在目录下自动引入文件 | 如果查找不到则到上一级目录下查找 | ||
index.js;或者使用package.json文件声明main属性, 来指定要引入的文件名称。 | 直到顶层目录一直访问到d c 盘 |
四、包和NPM
NPM:Node Package Manage
包(Package):就是目录模块,里边包含有多个文件,其中就有一个文件命名为package.json的文件,是包说明文件。
自动下载 http://www.npmjs.com
①切换到下载的目录
cd 完整的路径;
change directory
②要下载的目录下,按住shift键,单击鼠标右键->在此处打开powershell窗口
③使用npm安装第三方包
*npm install 包的名称
五、核心模块
nodeJS官方提供的模块,可以直接引入,不需要创建。
浏览器向服务器发送请求,传递数据的一种方式
http://www.code.boy.com/product_details.html?lid=5&name=dell
name=tom&age=18
1、查询字符串模块—querystring
parse() 将查询字符串解析为对象
stringify()将对象转换成查询字符串
2、url模块
parse() 将url解析为对象
protocol 协议
hostname 主机(域名)
port 端口号
pathname 文件在服务器上的路径
query 查询字符串
format() 将对象转换成url
query属性对应的是对象
3、文件系统模块—fs path:路径
①fs.stat(path,(callback)=>{ //fs.statSync(path)
path 要查看的文件路径
callback 回调函数,里边有!两个参数!
err 如果查看失败的错误信息
stats 文件的状态信息
stats.isDirectory()是否为目录
stats.isFile()是否为文件
查看文件的状态,通过回调函数来获取结果。
对比同步和异步区别?
同步会阻止后续代码的执行,只有方法执行完,才能继续执行后边的代码;是通过返回值来获取结果。
异步不会阻止后续代码的执行,把执行的结果放到整个程序的最后执行;是通过回调函数来获取结果。
②fs.mkdir(path,callback)/fs.mkdirSync(path)创建目录
path 要创建的目录的路径
callback 回调函数,只有一个参数
err如果创建失败的错误信息
③fs.rmdir(path,callbacl)/fs.rmdirSync(path) 删除目录
path 要删除的目录的路径
callback 回调函数,获取删除的结果
err 如果删除失败的错误信息
④fs.readdir(path,callback) 读取目录中的文件
callback
files 读取的文件 ,返回一个数组!!
⑤fs.writeFile(path,data,callback) 写入文件/创建文件
data 要写入的数据
如果文件不存在,则创建文件;如果文件已经存在,则清空文件中的内容,然后写入。
六、文件系统模块—fs
①fs.unlink(path,callback)/fs.unlinkSync(path) 删除文件
②fs.existsSync(path) 判断文件是否存在 存在是true 不存在false
③fs.readFile(path,callback)/fsreadFileSync(path); 读取文件
返回的数据是buffer形式。
④fs.appendFile(path,data,callback)/fsappendSync(path,data) !既可以创建也可以写入
追加写入,如果文件不存在则创建文件,如果文件已经存在,则在末尾写入数据
七、htt协议
是浏览器和web服务器之间的通信协议。
1、通用头信息
Request URL:请求URL,要向服务器端请求哪个文件。
Request Method:请求的方法。 get/post
Status Code:响应的状态码
200系列 属于服务器端成功响应
300系列 响应的重定向,跳转到另一个网址
400系列 客户端请求错误
500系列 服务器端错误
Romot Address:请求的远程服务器的IP地址和端口
2、响应头信息
Connection:keep-alive;连接方式:持续连接
Content-Type:text/html;响应的类型文件
Content-Encoding:响应的文件压缩形式
transfer-Encoding:响应时的传输方式,chunked(分段传输)
Location:响应时跳转的url,通常要结合着300系列的状态码。
3、请求头信息
Accept:客户端接收的文件类型有哪些
Accept-Encoding:客户端接收的文件压缩形式
Accept-Language:客户端接收的的语言类型
Connection:客户端和服务器端的连接方式,持续连接,keep-alive;
4、请求主体
可有可无,用于客户端向服务器端传递数据
八、http模块
可以模拟浏览器向服务器端发起请求,也可以创建web服务器
1、模拟浏览器
http.get(url,callback);
get: 请求的方法
url: 请求的网址
callback: 回调函数(用来获取服务端的响应)
res: 响应的对象
res.statusCode: 获取响应的状态码
res.on('data',(buf)=>{ })
使用事件来获取服务器端响应的数据
buf是服务器端响应的数据,格式为buffer数据
2、创建web服务器
var http.createServer() 创建web服务器
server.listen() 分配端口,监听3000端口的变化
server.on('request'(req,res)=>{});
//接收浏览器的请求,是一个事件,一旦有请求,自动执行
req 请求的对象
url 请求的路径,只显示端口后的部分,不显示端口域名。
method 请求的方法,直接通过地址栏默认使用get方法
headers 请求的头信息
res响应的对象
write() 响应的内容为文本形式,向浏览器中写入文本。
writeHead(302, { } ) 第一个参数是状态码,第二个是响应的头信息,如果要跳转需要设置Location属性
end() 响应结束
九、express框架
基于Nodejs,用于构建web服务器的框架
官网:www.expressjs.com.cn
安装: npm install express
引入第三方模块
const express=require('express');
var server=express();
server.listen(3000);
1、路由
浏览器向web服务器发来请求,web服务器要根据请求的方法和请求的URL来做出响应。
路由三要素:请求的方法、请求的url、响应的内容
响应的对象(res)
res.send(); 响应文本,只能响应一次send,如果是数字认为是状态码。
res.File(); 响应文件,必须使用绝对路径(__dirname+'/名称')
res.redirect() 响应的重定向
req.method 获取请求的方法
req.url 获取请求的url
req.headers 获取请求的头信息
req.query 获取请求时以查询字符串形式传递的数据,返回的格式为对象。
2、get和post
get请求以查询字符串的形式传递数据,服务器端使用 req.query获取数据,结果是对象
post请求是通过表单提交(现阶段)的方式传递数据,服务器端通过事件形式获取数据(后期会有简单方法)
req.on('data'(buf)=>{
//获取的结果也是buffer数据,需要使用查询字符串解析为对象querystring.parse
});
3、使用路由传递数据—路由传参
设置路由中接收的名称:
server.get('/detail/:lid',(req,res)=>{
req.params //获取路由传递的数据,格式为对象
});
浏览器请求方式: http://127.0.0.1/detail/5
5就是传递的数据,使用lid来接收
(4)路由器
路由在使用过程中,不同的模块可能出现相同的URL,把同一个模块下的路由挂载到特定的前缀。
例如:商品模块下的路由挂载/product,访问形式/product/list,
用户模块下的路由挂载到/user/,访问形式/user/list
const express=require('express');
var router=express.Router; //创建一个空的路由器
router.get('/list',(req,res)=>{
//往这个路由器中添加路由
});
module.exports=router;
在web服务器下使用路由器
const userRouter=require('/user.js'); //引用路由器模块
server.use('user',userRouter);把用户路由器挂载到/user下
访问形式 /user/list
(5)中间件
中间件的作用为主要的业务逻辑所服务。
分为五种:
(1)应用级中间件
应用级中间件:每一个中间件就是一个函数,需要配合其他的中间件或者路由来使用
server.use(回调函数) 拦截所有的路由
server.use('/detail',回调函数)拦截特定的路由
初始化一个全局变量,设置值为0,在中间件中实现变量的加1,在路由中响应变量。
res.send();
(2)路由级中间件
用于在服务器中将路由器挂载到特定的url
server.use('/user,userRouter')
url 路由器
(3)内置中间件
在express中只有一个内置的中间件
server.use(express.static('要托管的目录'));
托管静态资源到某一个目录,如果浏览器端要请求静态资源,则自动会到这个目录下查找
静态资源:HTML、css、客户端js、图像
(4)第三方中间件
(5)错误级中间件
十、MySQL模块
基础命令:
增 INSERT INTO emp VALUES(NULL,'tom'.....)
删 DELETE FROM emp WHERE uid=5;
改 UPDATE emp SET uname='jerry',sex=1 WHERE uid=5;
查 SELECT * FROM emp;
进入方法:
mysql.exe -h127.0.0.1 -P3306 -uroot -p
1、普通连接使用MySQL
var connection=mysql.createConnection({});创建连接对象,
参数中传递mysql服务器的主机、端口、用户名、密码、选择使用的数据库。
connection.connection();执行连接
connection.query(sql,callback);sql表示要执行的SQL语句,callback回调函数,用于获取sql语句的执行结果
connection.end();执行完SQL语句,关闭连接
2、使用连接池
var pool=mysql.createPool({});创建连接池对象,需要提供服务器的主机、端口、用户名、密码、使用的数据库,以及设置连接池的大小, connectionLimit
pool.query(sql语句,回调函数两个参数err,result);执行sql语句;sql是要执行的语句,callback获取sql语句的执行结果