node.js 运行在服务器端 只有一个运行环境 不存在兼容性问题
全局对象
1.global;
全局变量和全局函数都是全局对象global下的属性和方法;
2.console 对象;
log() //打印日志
info() //打印消息
warn()//打印警告
error()//打印错误
time()开始计时
timeEnd()结束计时
3.process 对象
arch //查看CPU架构
platform //查看操作系统
version //查看当前nodejs版本号
pid //查看当前的进程编号
kill() //结束指定编号的进程
4.Buffer
缓冲区,在内存中临时储存的区域,存储网络传输的资源
let buf= Buffer.alloc(5,"abcd") //创建buffer储存控件
String(buf)
buf.toString() //转字符串
模块
模块是一个功能体://核心模块 //自定义模块 //第三方模块
nodejs会自动给每个文件添加一个函数,程序员写的代码自动被函数包含,所有一个模块就是一个作用域
#示例
(function(){
//程序员写的代码
})
module.exports //导出的对象,引入一个模块就会得到该模块导出的对象
require() //引入模块
//导出功能
function getLength(r){
return 2*Math.PI*r;
}
function getArea(r){
return Math.PI*Math.pow(r,2)
}
module.exports={
getLength,
getArea
}
//导入功能
var circle=require("./circle.js");
var length=circle.getLength(5);
console.log(length)
模块中的默认参数
require: 是一个函数,用于引入模块
module: 当前模块的对象
module.exports 当前模块导出的对象
__filename: 当前模块的绝对路径,包括模块名称
__dirname: 当前模块的绝对目录
模块的分类
1.文件模块
以路径开头 require("./index.js") 用于引入自定义模块
不宜路径开头 require("http") 用于引入官方提供的核心模块
2.目录模块
以路径开头 require("./file") 会到目录下 寻找package,json 文件中查找main对应的文件,如果找不到会引入indexjs
不宜路径开头 require("index") 会到当前目录下node_modules中查找 index目录 找不到会一直往上以及目录下寻找
3.路径
上一级 ../
上上级 ../../
包和npm
包(package):就是一个第三方模块
npm: 用来管理包的工具,包含有下载安装、上传、升级、卸载…
npm -v 查看当前npm的版本号
下载地址: npm官网
(1)切换命令行的路径
cd 绝对路径 回车 如果有盘符变化需要添加 盘符名称: 回车
** 切换不同的盘符 盘符名称 c: 切换成功 再cd
在指定的目录的空白区域,按照shift键单击右键,选择‘在此处打开powershell窗口’
(2)下载包
npm install 包名称 回车
自动将下载的包放入到node_modules目录中,同时生成一个package-lock.json文件,用于记录当前 包的版本号。
模块
URL模块
# 网址 ,网络上的任何资源都有对应的URL
# http://www.web.com:8080/login.html
# 协议 域名 端口 请求的服务器文件路径
parse() #将查询字符串解析为对象 为了获取其中的数据
const url=require("url"); //引入url模块
let str="http://www.web.com:8080/login.html";
var addr=url.parse(str);
console.log(addr)
/*
Url {
protocol: 'http:',
slashes: true,
auth: null,
host: 'www.web.com:8080',
port: '8080',
hostname: 'www.web.com',
hash: null,
search: null,
query: null,
pathname: '/login.html',
path: '/login.html',
href: 'http://www.web.com:8080/login.html'
}
*/
querystring 模块
const querystring=require("querystring");
let str="kw=dell&price=4000";
var obj=querystring.parse(str)
console.log(obj) //{ kw: 'dell', price: '4000' }
示例片段: 解析以下url 获取查询字符串
const url=require("url"); //引入url模块
const query=require("querystring") //引入querystring模块
var str1="http://www.query.cn:433/web.html?cid=1995&cname=nodejs"; //字符串
var obj1=url.parse(str1); //把url解析为对象
var str2=obj1.query; //获取url对象下的查询字符串
var obj2=query.parse(str2); //解析查询字符串
console.log(obj2) //{cid:"1995",cname:"nodejs"}
console.log(obj2.cname) //"nodejs"
timer 全局模块
#一次性定时器
let timer=setTimeout(回调函数,间隔时间);
当间隔时间到了,会执行一次回调函数
clearTimeout(timer)
示例
const { clearTimeout } = require("timers")
let timer=setTimeout(()=>{
console.log("boom boom boom")
},3000)
clearTimeout(timer)
#周期性定时器
let timer=setInterval( 回调函数, 间隔时间 )
每隔一段时间,执行1次回调函数
clearInterval(timer);
示例
const { clearTimeout } = require("timers");
let timer=setInterval(() => {
console.log("铃铃铃")
}, 3000);
clearTimeout(timer)
#立即执行定时器
let timer=setImmediate( 回调函数 )
在主程序后的事件队列的最前边执行。
clearImmediate(timer)
示例
let timer=setImmediate(()=>{
console.log(1)
})
fs模块
文件系统模块,用于文件的操作
文件分为文件形式和目录形式
fs.readdir(路径, 回调函数) 通过回调函数获取读取的目录
fs.readdirSync(路径) 通过返回结果(变量)获取读取的目录
引入fs模块
const fs=require("fs");
let obj=fs.readdirSync(路径) //通过返回结果获取读取目录
let obj=fs.readdir(路径,(err,obj)=>{ //通过回调函数获取读取的目录
//err可能产生的错误;
//arr读取的结果
}) //通过回调函数获取读取目录
let obj=fs.statSyn("路径") //查看文件的状态
obj.isFile() //是否为文件
obj.isDirectory() //是否为目录
fs.mkdir("路径","回调函数") /fs.rmdirSync("路径") //移除目录
fs.writeFile("文件路径","写入的数据","回调函数") //覆盖写入 不存在就创建 存在 直接写入
fs.appendFile("文件的路径","写入的数据","回调函数") //追加写入
fs.readFile("文件路径,回调函数") //读取文件
fs.unlink("文件路径,回调函数") //删除文件
fs.existsSync("文件路径") //检测文件是否存在
fs.copyFile("源文件路径","目标文件路径","回调函数") //拷贝文件
fs.createReadStream("文件路径") //创建可读取的文件流
fs.createWriteStream("文件路径") //创建可写入的文件流
同步:阻止后续代码的执行,只有执行完当前才会往后执行其它的;通过返回值获取结果
异步:不阻止后续代码的执行,通过回调函数获取结果`
http模块
//引入http模块
const http=require('http');
//创建web服务器
const app=http.createServer();
//设置端口
app.listen(8080);
//通过事件接收浏览器请求,一旦有请求会执行回调函数
app.on(‘request’, (req,res)=>{
req 请求的对象
req.url 获取请求的URL,端口号后的部分,例如 /jianbing
req.method 获取请求的方法
res 响应的对象
res.writeHead(状态码, 对象) 设置响应的状态码和内容,第二个参数可以为空
res.write() 设置响应的内容
res.end() 结束并发送响应
});
const http=require("http");
const app=http.createServer();
app.listen(8080);
app.on("request",(req,res)=>{
if(req.url==="/list"){
res.write("this id product list");
}else if(req.url==="/index"){
res.writeHead(200,{
'Content-Type':'text/html;charset=utf-8'
});
res.write('<h2>这里是首页<h2>')
}else if(req.url==="/study"){
res.writeHead(302,{
Location:"http://www.baidu.com"
})
}else{
res.writeHead(404);
res.write('not found')
}
res.end()
});
第三方模块
express
1.创建web服务器
const express=require("express");
const app=express(); //创建web服务器
app.listen(8080); //设置端口
2.路由
用来接受请求,以及做出响应
可以处理特定的请求,包括请求的方法、请求的URL、回调函数。
当浏览器发出的请求匹配请求的方法和请求的URL就会自动触发该路由,执行回调函数。
练习:创建路由,请求的方法get,请求的URL /list,响应’这是商品列表’。
res响应的对象
res.send() 设置响应的内容并发送
res.sendFile() 设置响应的文件并发送,文件需要使用绝对路径 __dirname
res.redirect() 设置响应的重定向(跳转)
简单示例 JS
const express=require("express");
const query=require("querystring")
const app=express();
app.listen(8080);
app.get("/search",(req,res)=>{
res.sendFile(__dirname+'/search.html')
})
app.get("/login",(req,res)=>{
res.sendFile(__dirname+"/login.html")
})
app.get("/mysearch",(req,res)=>{
res.send("点击成功")
})
app.post("/mylogin",(req,res)=>{
req.on("data",chunk=>{
var let=String(chunk)
var result=query.parse(let);
console.log(result.uname)
})
res.send("查询成功")
})
//路由传参
app.get("/shopping/:lid/:num",(req,res)=>{
console.log(req.params);
res.send("添加成功")
})
简单示例HTML /login
<form action="/mylogin" method="POST">
用户: <input type="text" name="uname"><br>
密码: <input type="password" name="upwd"><br>
<input type="submit">
</form>
以上不同模块下的URL可能会出现相同,无法进行团队模块化开发
为了解决以上的问题 把同一个模块下的路由放在一起 最后把路由挂载到服务器下
路由器
const r=express.Router(); //创建路由器
//往路由器r中添加路由
module.exports=r;//导出路由器对象
web服务器 引入路由器并挂载
app.use( 添加的前缀, 引入的路由器 )
示例
服务器:
const express = require("express");
const app=express();
app.listen(8080);
//引入用户路由器
const userRouter=require("./user");
app.use("/user",userRouter)
//用户路由器
const express=require("express");
const userRouter=express.Router();
userRouter.get("/login",(req,res){
res.send("响应成功")
})
module.exports=userRouter